Kirjoittaja Aihe: [ ratkaistu ] Päivämäärämuodon muuttaminen calcissa tai csv-tekstinä  (Luettu 768 kertaa)

teele

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


« Viimeksi muokattu: 07.09.18 - klo:21.18 kirjoittanut teele »

nm

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

teele

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


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.


JJK

  • Käyttäjä
  • Viestejä: 305
  • Lubuntu 16.04
    • Profiili
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.

SuperOscar

  • Käyttäjä
  • Viestejä: 3320
  • Tänään täällä, huomenna poissa
    • Profiili
    • Legisign.org
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).

Koodia: [Valitse]
#!/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)
openSUSE Leap 15.0 (pöytäkone 1, kannettavat 1 & 2), Lubuntu 18.04 (HTPC), Linux Mint 19 (pöytäkone 2), Trisquel GNU/Linux 8.0 (kannettava 3), Raspbian GNU/Linux 9 (nimipalvelin)

teele

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

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  :)

SuperOscar

  • Käyttäjä
  • Viestejä: 3320
  • Tänään täällä, huomenna poissa
    • Profiili
    • Legisign.org
Harjoituksen vuoksi ja huvin kannalta, tässä vielä sama zsh:lla:

Koodia: [Valitse]
#!/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:

Koodia: [Valitse]
#!/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*
« Viimeksi muokattu: 14.09.18 - klo:15.26 kirjoittanut SuperOscar »
openSUSE Leap 15.0 (pöytäkone 1, kannettavat 1 & 2), Lubuntu 18.04 (HTPC), Linux Mint 19 (pöytäkone 2), Trisquel GNU/Linux 8.0 (kannettava 3), Raspbian GNU/Linux 9 (nimipalvelin)