Holló!
Felállás: egy programból adatokat tudok kiexportálni csv-be. Egy másik programba szeretném ezt beolvasni, de transzformációra van szükség.
Két problémával szembesültem eddig:
1) az exportált adatok között a dátum mezők formátuma ilyen: 01/06/2020 05:11:33
A másik program más formátumot vár: Timestamp format must be yyyy-mm-dd hh:mm:ss
2) a kiexportált adatok mellett szeretném, ha a második program még néhány számolt értéket is kapna.
Az első pontra olyan ötleteim jöttek, hogy sed-ben megírom a teljes sor nagy részére illeszkedő mintát, aztán a dátum mezők különböző részeit megcímkézve az új sorrendben az új elválasztóval kiírom. Vagy date paranccsal meg tudom etetni a kapott időpontot és ki tudom íratni az elvárt formában. Ez a második tűnik egyszerűbbnek, remélem, a néhány száz sorban soronként kétszer meghívni a date-et nem lesz túl lassú.
A második pontot LibreOffice Calc-ban meg tudtam valósítani, (csv betölt, formulákat megír, ods-be kiment), és ezt ki tudom menteni csv-be ismét, és mentéskor a számolt értékeket írja ki nekem, de nem akarok minden egyes export után kézzel átalakítani mindent (pedig, ugye, ez az első pontra is adna megoldást). Le is tudom programozni, bár a shell script tudásom ehhez már kevés, szóval inkább python lenne.
Mind a számolásra, mind a dátum átalakításra jöhetnek ötletek. Bármi lehet, ami nem terheli le nagyon a laptopomat (azért max. 1000 sor feldolgozása ne tartson már hosszú ideig), illetve nem bánnám, ha elegáns, könnyen áttekinthető, egyszerű megoldás jönne. Feltételezem, hogy amit én pythonban programoznék le, azt awk-val elegánsan és röviden meg lehet oldani, és sed-del is, csak kevésbé olvasmányos formában. Persze biztos egy bash scriptben is ugyanazt az algoritmust le lehet írni, amit én pythonban megvalósítanék.
A formulák így néznek ki:
N10: =N9+M10
P10: =LOOKUP(K10,L:L,N:N) megkeresi a K oszlopban található timestamp-et az L oszlopban (az L oszlop növekvő sorrendben van, de vannak duplikációk). Ha van pontos egyezés, akkor az utolsót veszi, ha nincs pontos egyezés, akkor azt az utolsót, ami még kisebb nála.
Q10: =IF(O10="Yes",M10/P10," ")
K | L | M | N | O | P | Q |
---|---|---|---|---|---|---|
III. 10. 12:35:45 | 9 | |||||
III. 10. 17:55:21 | 123 | |||||
III. 10. 17:55:21 | 42 | |||||
III. 10. 21:47:04 | 66.6 | |||||
III. 10. 17:00 | 9 | |||||
III. 10. 17:55:21 | 42 | |||||
III. 10. 18:00 | 42 |
u.i: Szerkesztéskor a tábla jól néz ki, de a végső nézetben nálam elég gáz. Ha nálatok sem egyértelműek az oszlopok, akkor mondom, hogy csak a K, L, N és P oszlopban van adat.
- 336 megtekintés
Hozzászólások
Pythonban a time vagy még inkább a datetime modul és az strftime ill. strptime metódusok. A kereséshez meg a bisect modul. Ezekkel "elegánsan" meg tudod oldani a feladatot:D
- A hozzászóláshoz be kell jelentkezni
Hmm...
Arra szamitottam, hogy jonnek mindenfele otletek, de ugy latszik, hogy annal, hogy python-ban megirom a transzformaciot, nincs jobb otlete senkinek?
disclaimer: ha valamit beidéztem és alá írtam valamit, akkor a válaszom a beidézett szövegre vonatkozik és nem mindenféle más, random dolgokra.
- A hozzászóláshoz be kell jelentkezni
Én is programot írnék rá. Javában, mert az a kedvencem, de a Python ugyanúgy jó. Minden más végsősoron csak bonyolultabb lesz. A LOOKUP-ra kell tree map, és jól fog teljesíteni akármilyen nyelven is írod. Ameddig belefér a RAM-ba a teljes táblázat, addig nem lesz problémád.
- A hozzászóláshoz be kell jelentkezni
Ha csak ötlet kell, szerintem az egész megcsinálható sqlite-ban. Nem próbáltam és nem vagyok guru. Csak ötlet.
- A hozzászóláshoz be kell jelentkezni
Elvileg az átalakításra awk jó választás, aztán inkább pythont használnék calc helyett így lehet scriptet írni rá és gyorsabb lenne a dolog. Vagy elvileg pythonnal is megcsinálható minden, ennek az lenne az értelme, hogy mindent egyben intéz.
Van még két opció, amit érdemes megfontolni. az egyik az R, a másik a Julia. Minde a kettő tud importálni exportálni csv-be. Számításokra ezeket szokták még használni. A számolás jellegétől is függ a dolog, de általánosságban elmondható, hogyha a furásidőre akarsz optimalizálni, akkor Julia egy jó választás lehet. Kérdés, hogy mennyire fontos a futásidő, és amit csinálni akarsz mennyire erőforrás igényes.
Szóval azt kell eldöntened, hogy mennyire fontos, hogy gyorsan dolgozzon a rendszer, vagy mennyire legyen könnyű karbantartani. Kérdés, hogy érdemes-e új dolggal ismerkedni, hogy nyersze-e vele annyit. Mondjuk ha megírtad python-ban, akkor szerintem nem nagy kunszt átportolni Julia-ba, kicsit más a szintaxis, de a nagyrésze kb megegyezik, csak ne használj pythonban OOP-t és könnyű lesz.
- A hozzászóláshoz be kell jelentkezni
ha elég kicsi a feladat a julia uptime-ja (+néhány using) nagyobb lesz mint egy python teljes futási idő :-)
- A hozzászóláshoz be kell jelentkezni
Az időbélyeget én mindenképp stringként kezelném, mert egy string-dátum-string konverzió jelen esetben, amikor nem akarsz az időadattal számolni, fölösleges erőforráspazarlás. (Ráadásul a string egyes elemeinek a kezdete/vége ix fix pozíción kezdődik, ergo igen "olcsó" műveletekkel szeletelhető - sőt ha az exportált adatokban csak a dátum tartalmaz "/" jelet, akkor azt mezőelválasztóra cserélve awk-kal pofon egyszerűen át lehet rendezni, és az így "gatyába rázott" időbélyeggel bíró fájlt odaadni a számolgatós programnak.
- A hozzászóláshoz be kell jelentkezni
> Az időbélyeget én mindenképp stringként kezelném, mert egy string-dátum-string konverzió jelen esetben, amikor nem akarsz az időadattal számolni, fölösleges erőforráspazarlás.
Max 1000 sor, annak most mindegy. Persze ahogy most kinéz, valóban könnyen lehet stringként használni, tehát valóban "pazarlás" , meg mi lesz ha megnő. De a timestampeknek van egy olyan jó szokása agyfaszságok történnek, mert mégiscsak kiderül, hogy valahonnan lemarad a padding zero, vagy akármi, szóval rendes dátumként tekinteni rájuk azért robusztusabb, és a mégiscsak megnő, akkor a mégse lesz pont olyan is valószínűbbé válik. Cserébe persze stringként matatni nyilván megcsinálni is gyorsabb lehet, szóval ha nincs ettől félsz, akkor hajrá.
- A hozzászóláshoz be kell jelentkezni