it-swarm.com.de

Konvertieren Sie die TXT-Datei in eine durch Tabulatoren getrennte CSV-Datei

Tut mir leid, Leute, ich bin neu in Linux, und während ich die Liste der beantworteten Fragen durchgesehen habe, weiß ich nicht genug, um zu erkennen, ob meine Frage beantwortet wurde. Oder ob ich eine der Antworten an mein spezielles kleines Problem anpassen kann.

Ich erhalte eine Textdatei mit Daten von meinem Chef, der gelernt hat, wie man Computer einsetzt. und er wird sich nicht ändern. Die Daten sind fast eine CSV-Datei, mit der Ausnahme, dass alle Felder durch ein Leerzeichen und nicht durch ein Komma oder ein Tabulatorzeichen getrennt sind. Und die Textfelder von Daten enthalten auch eingebettete Leerzeichen.

Jedes Feld ist entweder eine Zahl oder Zahlen und Text, alle Felder sind unterschiedlich lang und keines wird durch einfache oder doppelte Anführungszeichen versetzt. Die Zahlenfelder überwiegen, und kein Textfeld grenzt an ein anderes Textfeld an. Selten steht in einem Textfeld vor oder nach einer eingebetteten Zahl ein [Leerzeichen].

Leider kann nicht jedes [Leerzeichen] einfach ersetzt werden. Da Feldumbrüche im Allgemeinen entweder in Form von [Leerzeichen] [0-9] oder [0-9] [Leerzeichen] erfolgen, bestimme ich, ob ein [Leerzeichen] in ein [Tabulatorzeichen] konvertiert werden soll. Charakter oder nicht. Befindet sich das [Leerzeichen] neben einer Ziffer, wird es in ein [Tabulatorzeichen] umgewandelt.

Mit der Funktion "Suchen/Ersetzen" in Notepad für Windows suche ich nach einer Ziffern-Leerzeichen- oder einer Leerzeichen-Ziffern-Kombination und konvertiere dieses [Leerzeichen] in ein [Tabulator] -Zeichen. Ich muss das zehnmal [0-9] [Leerzeichen] und dann noch zehnmal [Leerzeichen] [0-9] machen. Ich suche nach einem Skript, das dies automatisch erledigt.

Hier ist ein Beispiel für die Datei, die ich bekomme. Es enthält vier durch [Leerzeichen] getrennte Felder (erste Zeile). Jede folgende Zeile ist ein Datensatz, daher ist die zweite Zeile der erste Datensatz. Account ist 2281, Units sind 19, Description ist Toshiba PX-1982GRSUB {und schließlich enthält das Delta -Feld das 0:

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

Also, was ich suche, ist ein Skript, das die Originaldatei liest, die [Leer] -Zeichen, die Feldtrennzeichen sind, in Zeichen konvertiert und alles in eine neue Datei schreibt. Und ich möchte die Erklärung - damit ich nicht immer wieder dieselben Fragen stelle.

1
Bobby H.

Eine Websuche nach "Leerzeichen durch Komma ersetzen" war sehr erfolgreich. Hat das nicht zuerst für Sie geklappt? Hätte viele Antworten gefunden wie this :

tr ' ' ',' < input > output

oder für Tabs:

tr '\t' ',' < input > output

und

sed 's/\s\+/,/g' input > output

\s ist die Leerzeichenklasse (wie [: space:]) und sollte auch alle Läufe (+ (escaped) = eines oder mehrere der vorhergehenden Zeichen) von Leerzeichen oder Tabulatoren oder Zeilenumbrüchen ersetzen. Das nächste ersetzt nur jedes einzelne Leerzeichen oder Tabulatorzeichen durch ein einzelnes Komma (wie bei beiden über tr):

sed 's/[ \t]/,/g' input > output

Und -i bearbeitet die Datei direkt in sed

Hier ist ein Sed, das einer Leerzeichen-Nummer oder einem Leerzeichen-Nummer entspricht und diese durch ein Komma ersetzt, wobei der OR Befehl/Symbol | als \| maskiert wird:

sed 's/ [0-9]\|[0-9] /,/g'
1
Xen2050

Ok, Sie müssen also die ersten beiden und die letzten Leerzeichen in jeder Zeile durch Kommas ersetzen. Sie können nicht einfach jedes Leerzeichen ersetzen, da das dritte Feld selbst Leerzeichen enthalten kann. Sie können dies mit der Ersetzung regulärer Ausdrücke tun. Hier ist ein sed Skript/Befehl, der funktioniert:

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv

Mit dem obigen Beispiel wird Folgendes zurückgegeben:

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

Dies ist bei der Behandlung leerer Felder immer noch recht fragil und bricht vollständig ab, wenn andere Spalten als die dritte Leerzeichen enthalten. Es ist sehr einfach, solche fehlerhaften Daten einzufügen, wenn sie von Ihrem Chef manuell formatiert wurden. Sie sollten ihm vorschlagen, auf ein robusteres Tabellenformat (z. B. richtiges CSV & Co.) und einen stabileren Editor zu wechseln (gängige Tabellenkalkulations-Tools können CSV recht gut und flexibel verarbeiten, z. B. LibreOffice/OpenOffice Calc, Microsoft Excel und Google Docs).

1
David Foerster