Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 21.12.22 - klo:22.26

Otsikko: [ ratkaistu ] c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: teele - 21.12.22 - klo:22.26
Kopsasin tiliotteeni tekstin pankin sivulta tekstinmuokkaimeen ja sitten haluaisin poistaa välilyönnin luvusta

1 300,00     (kopsattu päätteestä omasta ohjelmastani)

Mutta kun omassa ohjelmatekstissäni on tämän luvun käsittelyyn koodia

Koodia: [Valitse]
std::cout << "s33 raaka on " << s33 << std::endl;               
s33.erase(remove(s33.begin(), s33.end(), ' ' ), s33.end() );
std::cout << "s33 ilman tyhjää on " << s33 << std::endl;

niin toivoisin sen välilyönnin luvusta 1 300 poistuvan.

Kuitenkin ohjelman aputulostukset ovat tällaiset

Koodia: [Valitse]
s33 raaka on 1 300,00
s33 ilman tyhjää on 1 300,00

Muistikuvani on vielä sellainen, että joskus aikaisemmin ohjelma olisi todella poistanut välilyönnin luvusta. Onko välilyönniltä näyttävä merkki mahdollisesti jokin muu merkki, vaikuttaisiko kopiontitapahtuma jotenkin asiaan, ehkä utf-8 ja char-ristiriitaisuuksia?



Otsikko: Vs: c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: AimoE - 22.12.22 - klo:07.06
Kopsasin tiliotteeni tekstin pankin sivulta tekstinmuokkaimeen ja sitten haluaisin poistaa välilyönnin luvusta
Ne pankit, joiden verkkopankin olen nähnyt, tarjoavat kaikki erikseen tapahtumaluettelon (itse valitulta ajalta) csv-muodossa, jolloin niitä välilyöntejä ei ole. Onko sinulla pankki joka tarjoaa vain tiliotteen eikä tapahtumaluetteloa ollenkaan, vai onko sinulla pankki joka tarjoaa tapahtumaluettelon sellaisessa muodossa, että siinä on välilyönnit mukana?
Otsikko: Vs: c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: nm - 22.12.22 - klo:11.28
Muistikuani on vielä sellainen, että joskus aikaisemmin ohjelma olisi todella poistanut välilyönnin luvusta. Onko välilyönniltä näyttävä merkki mahdollisesti jokin muu merkki, vaikuttaisiko kopiontitapahtuma jotenkin asiaan, ehkä utf-8 ja char-ristiriitaisuuksia?

On mahdollista, että väli on jokin erikoismerkki. Pystytkö laittamaan tänne liitteeksi esimerkkitiedoston, jossa ongelma esiintyy? Tai voit itsekin tutkia sisältöä heksaeditorilla tai hexdumpilla:

Koodia: [Valitse]
hexdump -C tiedosto.txt

Sinänsä koodin pitäisi toimia, jos väli on väli (ASCII-koodi 32 eli 0x20). Testasin tällaisella ohjelmalla:

Koodia: [Valitse]
#include <iostream>
#include <algorithm>

int main(int argc, char *argv[]) {
if (argc < 2) {
std::cout << "usage: " << argv[0] << " <string>\n";
return 0;
}
std::string s33(argv[1]);

std::cout << "s33 raaka on " << s33 << std::endl;               
s33.erase(remove(s33.begin(), s33.end(), ' ' ), s33.end() );
std::cout << "s33 ilman tyhjää on " << s33 << std::endl;
return 0;
}

Koodia: [Valitse]
g++ -Wall -std=c++14 -o removespace removespace.cpp
Koodia: [Valitse]
./removespace '1 300,00'
Lainaus
s33 raaka on 1 300,00
s33 ilman tyhjää on 1300,00
Otsikko: Vs: c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: AimoE - 22.12.22 - klo:12.14
Kopsasin tiliotteeni tekstin pankin sivulta

Minulta jäi huomaamatta tuo "kopsasin" -- ajattelin tiedoston  latausta. Niinpä nm on varmasti oikeassa.

On mahdollista, että väli on jokin erikoismerkki.

Näin minullekin on käynyt yhdessä pankissa, joka ei tarjonnut tapahtumaluetteloa erikseen tiedostona.
Otsikko: Vs: c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: teele - 22.12.22 - klo:20.43
Ainakin tämä tiliote näyttää toimivan, kun erasea vähän muutetaan. Numeroiden väli ei olekaan tekstinmuokkaimen tiedostossa ainoastaan yksi erikoismerkki vaan kaksi.

Onnistuin poistamaan ne näillä

Koodia: [Valitse]
    s33.erase(remove(s33.begin(), s33.end(), char(194)  ), s33.end() );
    s33.erase(remove(s33.begin(), s33.end(), char(160)  ), s33.end() );

Apua etsinnässä oli sivuista

https://onlinestringtools.com/convert-string-to-ascii
https://www.asciitable.com/

tosin jölkimmäinen ei oikeastaan ehkä olekaan tarpeellinen

Tiliotteessa on html sivulta kopsattuna siis välilyönnin sijasta ne omituiset merkit, mutta muuten numerot ovat numeroita ja kirjaimet kirjaimia koodimuuntimen mukaan. Vähän ihmetyttää, miksi välilyönti ei voi olla välilyänti html sivullakin ?? Mihin näillä omituisilla merkeillä pyritään??

Kiitos neuvoista, taas tämäkin näyttää ainakin ratkenneen :)
Otsikko: Vs: c++ std::string välilyönnin poisto ei onnistu
Kirjoitti: AimoE - 22.12.22 - klo:20.55
Vähän ihmetyttää, miksi välilyönti ei voi olla välilyänti html sivullakin ?? Mihin näillä omituisilla merkeillä pyritään??

Todennäköisimmin kyse on ns. sitovasta välilyönnistä, eli tyhjästä, jonka kohdalla tekstin (tässä tapauksessa numeron eri osien) jako eri riveille on estetty.

Nettisivulle sen saa kirjoittamalla HTML-koodiin
Koodia: [Valitse]
&nbsp; ja LibreOffice:ssa yms. ohjelmissa se löytyy valikosta tyyliin Lisää / Muotoilumerkki / Sitova välilyönti.