Portál AbcLinuxu, 16. července 2025 14:52


Dotaz: sloučení několika souborů ve formátu *.csv

9.5.2006 23:54 pavel
sloučení několika souborů ve formátu *.csv
Přečteno: 836×
Odpovědět | Admin
Dobrý den,rád bych poprosil o pomoc.

Mám několik souborů ve formátu *.csv.

Takto se mi soubory zobrazí v OpenOffice - Calc:

Prvni_soubor.csv:
Nějaký_text - hlavička
data1 data2 datan 1.1.2006
data1 data2 datan 2.1.2006
data1 data2 datan 3.1.2006
data1 data2 datan 4.1.2006
data1 data2 datan 5.1.2006

Druhy_soubor.csv:
Nějaký_text - hlavička
data1 data2 datan 3.1.2006
data1 data2 datan 4.1.2006
data1 data2 datan 5.1.2006
data1 data2 datan 6.1.2006
data1 data2 datan 7.1.2006

Treti_soubor.csv:
Nějaký_text - hlavička
data1 data2 datan 4.1.2006
data1 data2 datan 5.1.2006
data1 data2 datan 6.1.2006
data1 data2 datan 7.1.2006
data1 data2 datan 8.1.2006
data1 data2 datan 9.1.2006
data1 data2 datan 10.1.2006

Potřebuji, aby mi vypadlo:

Nějaký_text - hlavička
data1 data2 datan 1.1.2006
data1 data2 datan 2.1.2006
data1 data2 datan 3.1.2006
data1 data2 datan 4.1.2006
data1 data2 datan 5.1.2006
data1 data2 datan 6.1.2006
data1 data2 datan 7.1.2006
data1 data2 datan 8.1.2006
data1 data2 datan 9.1.2006
data1 data2 datan 10.1.2006
Jinak musím otevřít všechny soubory v Calcu, porovnat, kopírovat, vložit atd. atd.atd...

Poradil by mi někdo jak na to, popř. jaký příkaz na to použít?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.5.2006 01:22 tomas
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Odpovědět | | Sbalit | Link | Blokovat | Admin

Berte to spíše jako návod, kudy se ubírat, než přesné řešení Vašeho problému:

echo "title1\ttitle2\ttitle3\tdate" >union.csv

sed -e 1d *_soubor.csv |sort |uniq >> union.csv

10.5.2006 19:52 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Díky za odpověď, zkusím si to nastudovat.
12.5.2006 10:08 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli to dobře chápu, tak je potřeba vzít všechny datové řádky ze všech souborů, setřídit je podle data, vyházet duplicity a pak to všechno vypsat. Zkusil jsem to napsat v Pythonu. Nejvíc komplikací je s tím tříděním, protože je potřeba datum ve formátu
9.1.2006
převést na trojici
(2006, 1, 9)
Pak to teprve lze použít jako klíč pro sort(). Tady je ten program:
#!/usr/bin/env python
import sys, os, fileinput, re

data = {}
regexp = re.compile('^.*\s+(\d+)\.(\d+).(\d{4})\s+$')
for line in fileinput.input():
  if fileinput.isfirstline():
    hlavicka = line
  try:
    dmy = regexp.search(line).groups()
    key = map(int, dmy)
    key.reverse()
    key = tuple(key)
    data[key] = line
  except AttributeError:
    pass

keys = data.keys()
keys.sort()
sys.stdout.write(hlavicka)
for key in keys:
  sys.stdout.write(data[key])
Když se pustí s parametry
Prvni_soubor.csv Druhy_soubor.csv Treti_soubor.csv
tak vypíše tohle:
Nějaký_text - hlavička
data1 data2 datan 1.1.2006
data1 data2 datan 2.1.2006
data1 data2 datan 3.1.2006
data1 data2 datan 4.1.2006
data1 data2 datan 5.1.2006
data1 data2 datan 6.1.2006
data1 data2 datan 7.1.2006
data1 data2 datan 8.1.2006
data1 data2 datan 9.1.2006
data1 data2 datan 10.1.2006
Nevím, která hlavička tam patří, tak jsem ji vzal z posledního souboru.
12.5.2006 12:14 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Ještě bych chtěl upřesnit ty data, přesný formát je:

data1;data2;datan;2006-05-28 18:20:10

data1;data2;datan;2006-05-28 18:20:10

12.5.2006 12:41 xxl
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Nevím, jestli to správně chápu. Ale co použít něco takového:
tail +2 Prvni_soubor.csv > data
tail +2 Druhy_soubor.csv >> data
tail +2 Treti_soubor.csv >> data

echo "Nějaký_text - hlavička" > Vysledny_soubor.csv
sort -t\; -gk4,4 data >> Vysledny_soubor.csv
12.5.2006 13:18 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Takže já jsem zkusil:

cat *.csv >spojeno.csv

cat spojeno.csv|sort -n -u -t- -k1,1 >trideno_dle_datumu

Funguje to, ale u toho -t mi nefunguje parametr středník, který tam měl být původně.

Děkuji všem a hlavně prvnímu v této diskuzi, co mi odpověděl a navedl správným směrem.

12.5.2006 20:06 tomas
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv

problém je v tom,že středník je ostrý znak shellu pro oddělování příkazů, které jsou na jednom řádku. Řešení je popsáno v příspěveku od neznámého xxl.

Ještě si zkontrolujte, zda vám hlavičky neskončily na konci výsledného souboru (|tail). Řešením by pak bylo použít místo cat *.csv ,něco jako sed -s -e 1d *.csv

13.5.2006 17:58 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Je to tak, ten příspěvek se středníkem jsem přehlédl (t\;).

Hlavičky mi vychází dobře, ale ten příkaz si aspoň zkusím.

15.5.2006 20:18 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Tak mi to jede dobře jen s jedním měsícem, pokud tam přidám soubory s dalším měsícem, třídí to špatně. Tak jsem zase na začátku, pomoc...
15.5.2006 22:17 pavel
Rozbalit Rozbalit vše Re: sloučení několika souborů ve formátu *.csv
Takže takto mi to třídí dobře:

cat *.csv >spojeno.csv

cat spojeno.csv |sort -u -t- -k2 >trideny.csv

Už jsem myslel, že to nepůjde a vzdám to.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.