Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 07.09.18 - klo:18.46
-
Tarkoitus olisi muuttaa csv-rivi
"7.9.2018";"KALLE KELMILÄ";"TILISIIRTO";"'VIPPI";"450"
esimerkiksi muotoon
"2018-09-07";"KALLE KELMILÄ";"TILISIIRTO";"'VIPPI";"450"
Tavoitteena on saada päivämäärä calciin sellaisessa muodossa, että rivejä voi järjestää päivämäärän perusteella.
Homma onnistuu varmaan perus c++:llakin, mutta miten se menisi tyylikkäimmin vähillä koodiriveillä. Pythonkin käy tietysti, mutta miten on säännöllisten lausekkeiden kanssa.
Ehkä cin:iin saa jotenkin erottimeksi pisteen, ja sitten voi vain lukea 3 kertaa lainausmerkin jälkeen, tai jotain sen tyylistä....
-
Jos kaikki päivämäärät ovat samassa muodossa, pitäisi riittää, että sarakkeen muuntaa päivämäärätyyppiseksi Calcissa.
Katso ekan vastauksen video täältä: https://ask.libreoffice.org/en/question/87210/calc-conversion-text-to-date/
-
Kiitos, näyttää sittenkin onnistuvan calcissa :)
Ensin luetaan csv, joka jättää päivämäärät tekstiksi. Sitten muutetaan kenttien numeroformaatti juuri sellaseksi, kuin se näyttää olevankin. Sitten korvataan päivämääräkenttien pisteet vaikka kirjaimella q. Sitten korvataan kenttien arvot niin, että q-kirjain muutetaan pisteeksi, ja kentät muuttuvatkin päivämääräkentiksi.
q-kirjaimen tilalla voi käyttää vaikka miinus (-) -merkkiä tai ehkä jopa å-kirjainta tai mitä vain.
Luultavasti calc laskee uudestaan muutetut kentät, ja koska kenttien formaatti on juuri sellainen kuin sinne tulevat päivämäärätkin, calc osaa muuttaa ne oikein päivämääriksi.
Ehkä asian voisi tehdä jopa yksinkeraisemmin, mutta en sitä keksinyt. Riittäisikö pelkkä kenttien uudelleen laskenta formaattimuunnoksen jälkeen on vielä kokeilematta.
-
Onnistuu se helpomminkin.
Kun Calcilla avataan csv-tiedosto niin se kysyy tekstin tuonnin asetukset.
Tässä voidaan valita sarakkeentyypiksi jo valmiiksi päivämäärä muoto "Päivämäärä (PKV)"
Sitten voit solun muotoilulla muuttaa päivämäärät haluamaasi muoto.
-
Ihan huvin vuoksi väänsin tuon Pythonillakin osoittaakseni ihan osoittaakseni, etteihän tähän edes tarvita sääntölausekkeita (vaikkei niissäkään Pythonille mitään ongelmaa ole).
#!/usr/bin/env python3
import sys
import os.path
import csv
for arg in sys.argv[1:]:
name, ext = os.path.splitext(arg)
with open(arg, 'r') as infile:
reader = csv.reader(infile, delimiter=';', quoting=csv.QUOTE_ALL)
with open(name + '_uusi' + ext, 'w') as outfile:
writer = csv.writer(outfile, delimiter=';', quoting=csv.QUOTE_ALL)
for line in reader:
date, *tail = line
day, month, year = [int(n) for n in date.split('.')]
date = '{}-{:02}-{:02}'.format(year, month, day)
line = [date] + tail
writer.writerow(line)
-
Kiitos lisävastauksista, kummatkin olivat oikein hyödyllistä tietoa. Nyt päivämäärät menevät oikein helposti jo tiedostoa avattaessa ja python-ohjelma on juuri sellainen, jollaisen olisin halunnut itsekin tehdä, jos olisin osannut :)
-
Harjoituksen vuoksi ja huvin kannalta, tässä vielä sama zsh:lla:
#!/bin/zsh
emulate -L zsh
IFS=";
"
local arg field
local -a datestr
integer fieldno
for arg in $*; do
fieldno=1
for field in $(<$arg); do
if (( fieldno == 1 )); then
field=${field:gs/\"//}
datestr=(${(s_._)field})
printf "\"%04d-%02d-%02d\"" $datestr[3] $datestr[2] $datestr[1]
else
printf ";%s" $field
fi
(( fieldno ++ ))
if (( fieldno > 5 )); then
fieldno=1
printf "\n"
fi
done
done
…ja AWKilla:
#!/usr/bin/gawk -f
BEGIN {
FS = ";"
}
{
split(substr($1, 2, length($1) - 2), date, /\./)
day = strtonum(date[1])
month = strtonum(date[2])
year = strtonum(date[3])
printf "\"%04d-%02d-%02d\"", year, month, day
for (f = 2; f < NF; f ++)
printf ";" $f
printf "\n"
}
*ROTFLMAO*