Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 12.12.21 - klo:20.12
-
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ä :(
-
Oletko varma, ettei tiliotetta saa ladattua CSV-muodossa tai XML:nä? Mikä pankki on kyseessä?
-
Ensimmäisten kokeilujen jälkeen näyttäisi siltä, että tilitiedot saa
c++ -muotoon tällaisella pikku ohjelmalla.
#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.
-
Toimisikohan ...
https://docs.microsoft.com/fi-fi/office/troubleshoot/excel/incorrect-date-format-converted-csv-file
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.
-
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 ...
-
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
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")
-
Taisin saada toimimaan. Muoto vvvv-kk-pp vaikuttaa toimivan, En vielä laita säiettä kuitenkaan ratkaistuksi, pitää vielä varmistella ...
-
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 ...
vvvv-kk-pp hh:mm:ss