Kirjoittaja Aihe: [ ratkaistu ] Tiliotetiedot tekstimuodosta c++-vektoriin ehkä regexin avulla  (Luettu 3143 kertaa)

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili
Pankkitilin tiedot on satavissa tämän näköisessä muodossa

26.11.2021    
PALVELUMAKSU
PALVELUMAKSUT AJALTA 1.-31.10.2021    Palvelumaksu    -1,50 EUR
22.11.2021    
Peräkylän Sähkö Oy
765498 143764 760362    Tilisiirto    -143,91 EUR

Toiveena olisi saada tiedot c++ -vektoriin esimerkiksi muodossa
päivämäärä maksunsaaja euromäärä

Regexin avulla voisi tunnistaa päivämäärän ja seuraavalta riviltä maksun saajan
sekä kolmannelta riviltä euromäärän vaikka sen sisältämän pilkun avulla.

Mutta rivejä on vaihteleva määrä. Regexin ryhmien määrä olisi kai tiedettävä siis etukäteen?

Mikä olisi järkevin tapa saada päivämäärä, maksun saaja ja euromäärä c++ -vektoriin tällaisesta tekstimuotoisesta tilitapahtumatiedostosta.
Kannattaisiko tiedosto käydä läpi niin, että aina luettaisiin kolme riviä käsittelyä varten ja koko tiedosto askellettaisiin kolmen rivin ryhmissä.

En ole koskaan helposti onnistunut saamaan tilitietoja suoraan taulukkolaskentaan, vaikka se on varmaan periaatteessa mahdollista: liikaa säätöjä ja kieli- ym. asetuyksia, enkä muista koskaan selvinneeni niistä :(
« Viimeksi muokattu: 28.12.21 - klo:21.20 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16232
    • Profiili
Oletko varma, ettei tiliotetta saa ladattua CSV-muodossa tai XML:nä? Mikä pankki on kyseessä?

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili
Ensimmäisten kokeilujen jälkeen näyttäisi siltä, että tilitiedot saa
c++ -muotoon tällaisella pikku ohjelmalla.

Koodia: [Valitse]

#include <iostream>
#include <fstream>
#include <string>
#include <bits/stdc++.h>

#include <algorithm>


int main()
{
  std::fstream newfile;
  //std::regex re1( "^(\\d\\d)(\\.)(\\d\\d)(\\.)(\\d\\d\\d\\d)(.*)" );
  std::regex re1( "^(\\d\\d\\.\\d\\d\\.\\d\\d\\d\\d)(.*)" );
  std::regex re2( "(.*)" ); 
  //std::regex re3( "(.*\\t)(.*\\t)(.*)" );   
  std::regex re3( "(.*\\t)(.*\\t)(.*)EUR" );   
  std::smatch match1, match2, match3;
 
  newfile.open("tili_02.teksti",std::ios::in);
  if(newfile.is_open() )
    {
      std::cout << "pöööö" << std::endl;
      std::string row1, row2, row3;
      double sum_in = 0, sum_out = 0, event_sum;
      while(getline(newfile, row1))
        {
          if(regex_search(row1, match1, re1) == true) // pvm ekalla rivillä
            {
              if(getline(newfile, row2) &&  getline(newfile, row3) &&
                 regex_search(row2, match2, re2) &&
                 regex_search(row3, match3, re3)
                )
                {
                  std::string s11 = match1.str(1);
                  std::cout << s11 << "\t";
                 
                  std::string s21 = match2.str(1);
                  std::cout << s21 << "\t";
                   
                  std::string s33 = match3.str(3);
                  s33.erase(remove(s33.begin(), s33.end(), ' ' ), s33.end() );
                  std::replace(s33.begin(), s33.end(), ',', '.'); 
                  event_sum = std::stod(s33);
                  std::cout << event_sum << std::endl;
                 
                  if(event_sum > 0)
                    { sum_in += event_sum;
                    }
                   if(event_sum < 0)
                    { sum_out += event_sum;
                    }                 
                }  // if loppuu                                 
            }  // if loppuu
        } // while loppui
      newfile.close();
      std::cout << "sum_in: " << sum_in << "  sum_out: "
                << sum_out << std::endl; 
    }  // if loppui tiedosto saatiin auki
}


Mutta jos haluaa, että  Libeoffice calc ymmärtää päivämäärät oikein, ne pitää luultavasti saada johonkin toiseen muotoon, muoto pp.kk.vvvv ei näytä toimivan.
Calcissa on englantilainen kieliasetus, ja joku englantilainen
päivämäärämuoto pitäisi kai valita? Pisteet näyttävät toimivan
desimaalierottimena.

regexin avulla voi pp.kk.vvvv -muotoa muutella tulostuksessa, mutta
mikä olisi kätevin tapa tulostaa päivämäärä niin, että calc
ymmärtäisi sen suoraan. Erottimena on käytetty tabia ja se toiminee.

En ole koskaan onnistunut saamaan tilitietoja suoraan taulukkolaskentaan, vaikka se olisikin ehkä periaatteessa mahdollista: liikaa kieli- ym. asetuksia tms.
« Viimeksi muokattu: 27.12.21 - klo:18.42 kirjoittanut teele »

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Toimisikohan ...

https://docs.microsoft.com/fi-fi/office/troubleshoot/excel/incorrect-date-format-converted-csv-file

Lainaus
Koodia: [Valitse]
kk/pp/vvvv

Edit - Ehdotus ei näyttäisi toimivan oletuksena. :(

Edit2 - Kelpaa, kun laittaa kyseisen sarakkeen pvm-formaatiksi USA:n, mutta muotoilut eivät siirry taulukkolaskentaan, vaan päivämäärä näkyy numeroarvona.
« Viimeksi muokattu: 27.12.21 - klo:20.51 kirjoittanut kamara »

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili
Juuri jotain tuonlaisia kekemuksia on etäisesti muistissani. Jotenkin jotain onnistuu, mutta ei ihan sujuvasti tai toimii vain osittain.

Ehkä jokin muu muoto voisi toimia, jos sen vain onnistuu löytämään. Regexin avulla voi kyllä vaihdella vvvvkkpp -järjestystä. Ehkä havainnollisin olisi järjestys vvvvkkpp, siitähän näkisi aikajärjestyksenkin melkein luonnollisesti. Pitänee vielä yrittää calcia penkoa ...

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Yksi vaihtoehto on tehdä se pythonilla...

odfpy:llä ...

... sillä voi tehdä kaikkea kivaa, mutta kynnys toimintaan on aika korkea.

pitää asentaa ainakin ...
python3-odf

Tässä esimerkki stackOverFlos:ta...

Taitaa olla tämä lähde...
https://stackoverflow.com/questions/63879224/set-border-for-table-cell-with-odfpy/63880582#63880582

Koodia: [Valitse]
from odf.opendocument import OpenDocumentSpreadsheet
from odf.table import Table, TableRow, TableCell
from odf.style import Style, TableCellProperties

document = OpenDocumentSpreadsheet()
table = Table(name="Table1")
document.spreadsheet.addElement(table)

some_style = Style(name="some style", family="table-cell")
#some_style.addElement(TableCellProperties(border=True))
some_style.addElement(TableCellProperties(border="0.74pt solid #808080"))
document.styles.addElement(some_style)
tr = TableRow()
table.addElement(tr)
cell = TableCell(stylename="some style")
tr.addElement(cell)

document.save("file.ods")

teele

  • Käyttäjä
  • Viestejä: 809
    • Profiili

Taisin saada toimimaan. Muoto vvvv-kk-pp vaikuttaa toimivan, En vielä laita säiettä kuitenkaan ratkaistuksi, pitää vielä varmistella ...


kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili

Taisin saada toimimaan. Muoto vvvv-kk-pp vaikuttaa toimivan, En vielä laita säiettä kuitenkaan ratkaistuksi, pitää vielä varmistella ...

Jep, näyttäisi toimivan myös minulla. Muoto näyttäisi olevan tarkemmin ...
Koodia: [Valitse]
vvvv-kk-pp hh:mm:ss