Datei "drehen"

flappinski

flappinski

Foren As
Hallo Leute,
heute will ich eine Datei "drehen", so dass die Spalten nachher in Zeilen stehen und die Zeilen in Spalten.
Eine kleines Beispiel:
vorher:
Name,id1, id2,id3
strasse,land,berg,brücken
geld,viel,wenig,mittel

nachher:
Name,strasse,geld
id1,land,viel
id2,berg,wenig
id3,brücken,mittel

Hat jemand eine Idde? Gibt es dafür vielleicht sogar ein Tool?
Danke und viele Grüsse,
Stephan
 
Hallo Leute,
heute will ich eine Datei "drehen", so dass die Spalten nachher in Zeilen stehen und die Zeilen in Spalten.
Eine kleines Beispiel:
vorher:
Name,id1, id2,id3
strasse,land,berg,brücken
geld,viel,wenig,mittel

nachher:
Name,strasse,geld
id1,land,viel
id2,berg,wenig
id3,brücken,mittel

Hat jemand eine Idde? Gibt es dafür vielleicht sogar ein Tool?
Danke und viele Grüsse,
Stephan
Schreib die einzelnen Einträge per SciLab oder Ocatave,.. in eine Matrix und transponiere diese.
Gruß, Georg
 
Hi Georg,
ich kenne SciLab oder Ocatave nicht, aber menst Du es kann mit 1000 Zeilen auf 300000 Spalten umgehen? Die Datei ansich ist schon eni gutes Gigabyte gross, bis jetzt haben schon viele Standalones aufgegeben.
Ich würde das gerne mit der Shell lösen, so ungefähr:
mit awk die Salte auftrennen und mit paste dann an die bisherige Datei anhängen...
falsch gedacht?
 
Hi Georg,
ich kenne SciLab oder Ocatave nicht, aber menst Du es kann mit 1000 Zeilen auf 300000 Spalten umgehen? Die Datei ansich ist schon eni gutes Gigabyte gross, bis jetzt haben schon viele Standalones aufgegeben.
Ich würde das gerne mit der Shell lösen, so ungefähr:
mit awk die Salte auftrennen und mit paste dann an die bisherige Datei anhängen...
falsch gedacht?
Geht auch.
Ist deine Tabelle denn voll belegt? Will heißen ist jeder Eintrag vorhanden oder hast du in den Zeilen mal mehr mal weniger Einträge?
Gruß, Georg
 
In welchem Dateiformat liegen die Daten denn vor? Ist das ein reines ASCII Textfile oder sind die Daten in einer DB gespeichert? An und für sich hört sich die Problemstellung nach "Transponieren von Tabellen" an - Excel beherrscht das beispielsweise 1A. Nur ob du bei Filegrößen von 1GB mit Excel glücklich wirst wage ich zu bezweifeln :D
 
@ Peregrine:
Dat ist genau mein Punkt. Mit Excel geht da schon lange, lange nix mehr.
Hier eine Lösung für mein kleines File:
for ((cells=1; cells<=5; cells++)) ; do cut -f $cells -d, test_table.txt | paste - - - - ; done;

zwei Probleme dabei:
1) Die "4" für die 4 Spalten muss ich vorher rausfinden. Gut das werde ich schon hinbekommen.
2) Die Anzahl der "-" bei paste muss durch die Anzahl der Zeilen im Datenfile definiert werden. Schon schwieriger...

Ausserdem halte ich es für total doof, die einzelnen Spalten immer wieder da rauszuholen. Folgender Ansatz gefällt mit schon besser:
cat test_table.txt | sed 's/$/\n/g' | sed 's/,/\n/g'

Dabei kommt folgendes raus:
Name
id1
id2
id3

strasse
land
berg
brücken

geld
viel
wenig
mittel



Jetzt müsste ich das nur noch wieder in die Spalten pressen können.....
 
ein erster Schritt wäre für mich:
Wie bekomme ich jede Zeile einer Datei in eine eigene Datei?
 
falls es jemand interessiert, ich habe eine Möglichkeit gefunden:

erst die Datei in einzelne Zeilen auftrennen:
split -1 -a5 gt_sim.txt # die -a Option lässt einen mehr als hundert Zeilen besarbeiten

dann eine Startdatei erzeugen:
cat xaaaaa | sed 's/,/\n/g' > first # ersetzt alle Kommas durch Linefeed -> dadruch sind die Spaltenüberschriften jetzt Zeilen überschriften

die erste Datei löschen:
rm xaaaaa

und mit allen anderen fortfahren:
for file in x* ; do cat $file | sed 's/,/\n/g' > second ; paste first second > temp ; mv temp first ; done
# hängt eine erzeugte Datei als Zeilen-End-zu-End an, speichert in einer temp-Datei und danach wieder als first umbenannt.

funktioniert, aber braucht relativ lange für 1 GB (bestimmt mehrere Minuten). Wer das optimieren kann, ist herzlich eingeladen, mitzuknoblen....
 
Zuletzt bearbeitet:
1) Bitte angewöhnen eigene Posts editieren und nicht zu jedem Satz ein neuer Post
2) Warum bewältigst du Files mit >1GB Größe als Textfile? Performance konvergiert gegen NULL :-)
 
Rein Interesse halber:
Was würdest du denn für ein Dateiformat nehmen?
Gruß, Georg

das würde mich auch interessieren.


Sorry, dass ich die Postanzahl erhöhe, aber ich denke, wenn der Post erst mal ne Weile steht, dann schaut sich keiner mehr den editierten an...
 
Wenn man mit der Shell arbeitet wird man an Textdateien nicht vorbeikommen.
Zuminidest mit Hochsprachen könnte man die ganze Chose im Binärformat ablegen, was tatsächlich performanter ist (kA wieso genau, wikipedia weiß da bestimmt was zu...).

Überhaupt liegt aber die Flaschenhals hier in der Tatsache, das es ein Shellskript ist. Die werden nämlich interpretiert und sind somit verdammt langsam. Vor allem da ja auch noch andere externe Programme aufgerufen werden, und das in jedem Schleifendurchlauf.

An deiner Stelle würde ich da etwas kompilierbares bemühen.
Die Datei (gerne als Text) einlesen, in ein zweidimesionales Array schaufeln, und eine der X Transponierfktn. nutzen, die einigermaßen schnell sind.
Zum schluss packst du dann den Spaß wieder zurück in eine (neue?) Datei.

Ich denke das sollte schneller gehen, vor allem, wenn du sachen wie [C]fscanf benutzt, wo du direkt formatiert einlesen kannst.

MfG
Sharoz
 
also,
ich habe das jetzt doch mit der shell gelöst, und zwar ziemlich schnell:
ähnliches prinzip, wie oben:
1) alle einzelnen zeilen in einzelne Dateien
2) mit sed -i in all diesen Dateien das TAB in ein newline geändert
3) mit paste x* > Out_File ziemlich schnell einen Zusammenschluss herbeigeführt.

@Sharoz: Du hast schon Recht, aber das zweidimensionale Array ist schon mal 300000 mal 1000 Zellen gross, und dass noch aufgefüllt mit Strings, da hakt und quietscht es an allen Enden und Ecken....
Ausserdem muss ich dann porgrammieren und die shell macht doch so viel Spass. Und es hat geklappt!
 
Für heutige Speichergrößen sollte das nicht so das Problem sein, aber du hast recht, man könnte sich auch mit Pointern in die Datei begnügen und damit arbeiten. Bzw, es auch schrittweise machen. Da kann man an allen Ecken und Enden noch optimieren ;-)

Mit Shell fühle ich micht immer unwohl. Da fehlt mir einfach was. Außerdem finde ich die Syntax gewöhnungsbedürftig. Aber jedem das seine ;-)

Sharoz
 
tja, und da habe ich wieder das problem:
leider kann ich nicht "zurückdrehen", da ich jetzt 300000 Zeilen zu drehen habe. Das bedeutet 300000 Dateien, die zwar sauber erstellt werden, aber nicht mehr als Argument für sed gelten (argument list too long).
Für den sed gibt es dabei eine Lösung ( mit der Variable), aber für paste ist das nicht so schön. Weiss hier jemand eine Lösung?
Oder muss ich doch in C einsteigen?

Anmerkung: selbst das löschen der 300000 Dateien gestaltet sich als äusserst schwierig!!
 
Jo,

300000 Dateien sind schon pathologisch.

Nimm doch einfach Perl, lad das ganze Textfile in ein Array und dreh das dann.

Das würde sogar mit einem Einzeiler gehen.
 
nun gut,
leider kann ich kein perl.
ich denke ich versuche es in C++, damit komme ich noch am besten klar.
oder kann mir jemand in Perl helfen?
Naja, das ist wohl etwas viel verlangt.
Trotzdem danke für Eure Anmerkungen
 
Rein Interesse halber:
Was würdest du denn für ein Dateiformat nehmen?
Gruß, Georg

Harr. Ich würde den Datenwust eben nicht in einer Datei packen, sondern in eine Datenbank. Es wird schon seine Gründe haben, warum der Programmierer das in eine Textdatei gepackt hat - keine Frage.
Den Vorschlag von Supersucker hätte ich auch gebracht und würde eine solche Lösung persönlich auch bevorzugen (Performance).
 
Warte mal, ich mach dir das mal schnell in Perl.......

Werds hier editieren, wenn ich fertig bin........
 

Ähnliche Themen

.cfg Datei Analysieren und Zeilen Stellenweise abändern

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

CSV-Datei mit einem Bash-Script erstellen

Server's Power

Problem mit Apache2 + MySQL Server

Zurück
Oben