Kirjoittaja Aihe: [ ratkaistu ] c++ std::string välilyönnin poisto ei onnistu  (Luettu 2795 kertaa)

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
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?



« Viimeksi muokattu: 22.12.22 - klo:20.44 kirjoittanut teele »

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: c++ std::string välilyönnin poisto ei onnistu
« Vastaus #1 : 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?

nm

  • Käyttäjä
  • Viestejä: 16424
    • Profiili
Vs: c++ std::string välilyönnin poisto ei onnistu
« Vastaus #2 : 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
« Viimeksi muokattu: 22.12.22 - klo:11.35 kirjoittanut nm »

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: c++ std::string välilyönnin poisto ei onnistu
« Vastaus #3 : 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.

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Vs: c++ std::string välilyönnin poisto ei onnistu
« Vastaus #4 : 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 :)

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: c++ std::string välilyönnin poisto ei onnistu
« Vastaus #5 : 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.