ubuntuusers.de

CSV-Datei aus mehreren Dateien

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Setoph

Anmeldungsdatum:
29. April 2013

Beiträge: 10

Hallo liebe Ubuntuuser,

renne gerade in eine Wand. Stundenlange Google Suche und eigenes rumfrickeln haben bisher nicht zum Erfolg geführt.

Mein Problem:

Ich habe einen Ordner in dem mehrere Textdatei (*.bka) sind. Jede Textdatei ist wie folgt aufgebaut:

Header

0,7868 \t 0,98098

In der ersten Zeile Metadaten In der zweiten Zeile zwei Zahlen getrennt durch einen Tabulator (\t).

Am Ende hätte ich gerne:

Header \t Header \t Header ...

0,7868 \t 0,98098 \t 0,7868 \t 0,98098 \t 0,7868 \t 0,98098 ...

mein bisherig erfolgversprechendster Versuch mit der BASH scheitert:

touch ~/Desktop/Ergebnis.csv

for a in ~/Desktop/Ausgangsdaten/*; do paste -d \t ~/Desktop/Ergebnis.csv ~/Desktop/Ausgangsdaten/$a ;done

Als Fehlermeldung bekomme ich

No such file or directory

Vielleicht kann mir jemand weiterhelfen,

Danke im voraus S.

fckawe

Avatar von fckawe

Anmeldungsdatum:
23. April 2011

Beiträge: 509

Wohnort: Freiburg im Breisgau

Hallo,

hmm, müsste so (oder so ähnlich) recht einfach machbar sein:

  1. Alle *.bka Dateien in einer Schleife durchgehen

  2. Pro Durchlauf: Erste Zeile holen und Inhalt jeweils in einer Variablen anhängen

  3. Pro Durchlauf: Zweite Zeile holen und Inhalt jeweils in einer (anderen) Variable anhängen

  4. Nach der Schleife: beide Variablen in eine neue Datei ausgeben

BTW: der Header müsste ja sicher auch jeweils zwei Spalten belegen, oder? Sonst hast du ja im Ergebnis nur halb soviel Header-Spalten wie Werte-Spalten...

Gruß, Gerald

EDIT: war jetzt erst einmal eine allgemeine Antwort ohne auf dein Problem mit deinem ersten Versuch einzugehen... Müsste ich mir (später) erst einmal genau ansehen... ☺

EDIT: naja, der file not found Fehler kommt, weil in $a schon das Verzeichnis mit drin ist, aber du das nochmal aufführst... so mal für den Anfang...

Setoph

(Themenstarter)

Anmeldungsdatum:
29. April 2013

Beiträge: 10

Du hast natürlich recht mit dem $a. Ein kleiner Test mit

echo $a

kam mir leider etwas spät in den Sinn. Aber leider löste das nicht das Problem.

Bin ja sogar bereit zur Not Python zu benutzen und die Datei Zeilenweise zusammenzubasteln 😉. "paste" klang nur so vielversprechend.

fckawe

Avatar von fckawe

Anmeldungsdatum:
23. April 2011

Beiträge: 509

Wohnort: Freiburg im Breisgau

Ok, hier nun eine Variante mit deinem (sicher sinnvollen) Ansatz mit paste:

erg=~/Desktop/Ergebnis.csv
tmperg=/tmp/erg_tmp.csv
rm -f "$erg"

for a in ~/Desktop/Ausgangsdaten/*.bka; do
        if [[ -s "$erg" ]]; then
                paste "$erg" "$a" >$tmperg
                mv "$tmperg" "$erg"
        else
                cp "$a" "$erg"
        fi
done

rm -f "$tmperg"

Ich denke, dein Hauptproblem wird gewesen sein, dass der paste-Aufruf ja erst einmal keine Datei schreibt. Der mv ist m.E. notwendig, weil paste mit Umleitung in eine Datei, die zugleich gepastet wird, wohl nicht funktioniert (deshalb die temporäre Datei).

Und noch einmal der Hinweis bzw. die Frage: ist es richtig, dass du nur halb so viele Header-Spalten im Ergebnis hast, wie Werte-Spalten?

Gruß, Gerald

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

Warum so kompliziert?

1
$ paste ~/Desktop/Ausgangsdaten/* >~/Desktop/Ergebnis.csv

Oder habe ich die Problemstellung nicht richtig verstanden?

Ciao

robert

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

@rklm - oh, den paste Befehle kannte ich gar nicht. Sollte genau das machen, was der OP braucht ☺

Und rklm möchte glaube ich einen Wiki-Artikel zu paste schreiben... ☺

Gruß, noisefloor

Setoph

(Themenstarter)

Anmeldungsdatum:
29. April 2013

Beiträge: 10

Danke erstmal für die Antworten soweit! @rklm klappt an sich sehr gut bis darauf das die Dateien wohl ein \r\n enthielten dass er natürlich nicht ersetzt. Soweit zum Zwischenergebnis:

1.bka \r

\t 1.bka \r

\t 2.bka \r

\t 2.bka \r\n

1e-300 9.99969 \r

\t 1e-300 \t 9.99969 \r

\t 1e-300 \t 9.99969 \r

\t 1e-300 \t 9.99969 \r\n

Zur Verdeutlichung habe ich \r, \n und \t ausgeschrieben

Ansonsten wäre das genaus das was ich will ☺.

Danke für die Variante von fckawe aber der Einzeiler trifft es auf den Kopf!

Ich muss dann noch mit sed ran und alle \r durch \t ersetzen (verdammte Rumkopiererei zwischen Systemen (auf Windows erstellt, auf Mac kopiert und landet nun bei mir auf Linux) Wenn jemand dafür Beispielscode hat können wir den Beitrag zutüten 😉

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

Setoph schrieb:

Ich muss dann noch mit sed ran und alle \r durch \t ersetzen (verdammte Rumkopiererei zwischen Systemen (auf Windows erstellt, auf Mac kopiert und landet nun bei mir auf Linux) Wenn jemand dafür Beispielscode hat können wir den Beitrag zutüten 😉

Es sollte wieder viel einfacher gehen:

1
$ dos2unix ~/Desktop/Ausgangsdaten/*

Das Paket musst Du ggf. noch installieren.

Ciao

robert

Setoph

(Themenstarter)

Anmeldungsdatum:
29. April 2013

Beiträge: 10

Danke rklm!

Habe mir gerade

sed -e 's/\r/\t/g' < ~/Arbeitsfläche/TEST/test.txt >~/Arbeitsfläche/TEST/test2.txt

gebastelt was funktioniert. Nun noch ein "&&" dazwischen und alles wird gut. Geht mit Sicherheit noch kürzer und eleganter (dos2unix) 😉 Das mit dos2unix werde ich mir mal anschauen!

Danke für Eure Hilfe S.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

Setoph schrieb:

Geht mit Sicherheit noch kürzer und eleganter (dos2unix) 😉

Ebend.

Das mit dos2unix werde ich mir mal anschauen!

Da gibt's nicht viel anzuschauen. Einfach installieren und aufrufen.

Ciao

robert

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

noisefloor schrieb:

Und rklm möchte glaube ich einen Wiki-Artikel zu paste schreiben... ☺

Der Artikel ist angelegt: Baustelle/paste

Antworten |