Bash Shell Scripting - CSV-Analyse
Ich versuche zu Parsen einer CSV mit potenziell 100k Zeilen. Hier sind die Kriterien die ich habe:
- Der index der Bezeichner
- Der Bezeichner Wert
Möchte ich abrufen, alle Zeilen in der CSV, die den angegebenen Wert im angegebenen index (durch Kommas getrennt).
Irgendwelche Ideen, unter der besonderen Berücksichtigung der Leistung?
InformationsquelleAutor der Frage tinkertime | 2009-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste Prototyp mit plain old
grep
undcut
:Wenn das schnell genug und gibt den richtigen Ausgang haben, sind Sie fertig. 🙂
InformationsquelleAutor der Antwort unwind
Siehe dieses youtube-video: BASH-scripting Lektion 10 arbeiten mit CSV-Dateien
CSV-Datei:
Bash-Skript:
Ausgabe:
InformationsquelleAutor der Antwort FRV
Als alternative zu
cut
- oderawk
-basierte one-Liner, Sie könnten die spezialisiertencsvtool
akaocaml-csv
:Laut der docs, es behandelt die Flucht, zitieren, etc.
InformationsquelleAutor der Antwort Andrey Vlasovskikh
CSV ist nicht ganz so einfach. Je nach den Grenzen der Daten, die Sie haben, haben Sie vielleicht sorgen zu machen über die zitierten Werte (enthält Kommas und Zeilenumbrüche) und Flucht-Zitate.
Also, wenn Ihre Daten sind beschränkt genug bekommen können, Weg mit einfache, Komma-splitting in Ordnung, shell-Skript, kann das leicht tun. Wenn auf der anderen Seite, werden Sie brauchen, um zu analysieren CSV 'richtig', bash wäre nicht meine erste Wahl. Stattdessen schaute ich mich auf einer höheren Ebene-scripting-Sprache, z.B. Python mit einem csv.reader.
InformationsquelleAutor der Antwort bobince
In eine CSV-Datei, jedes Feld wird durch ein Komma getrennt. Das problem ist, ein Feld selbst kann über ein eingebettetes Komma:
Die Sie wirklich brauchen, ein Paket Bibliothek, die robusten CSV-Unterstützung, anstatt sich auf mit Komma als Feld-Trennzeichen. Ich weiß, dass Script-Sprachen wie Python hat eine solche Unterstützung. Allerdings bin ich wohl mit der Tcl scripting Sprache, so dass ist, was ich verwenden. Hier ist eine einfache Tcl-script, das das tut, was Sie fordern:
Speichern Sie dieses Skript in einer Datei mit der Bezeichnung " csv.tcl und rufen Sie es als:
Erklärung
Das Skript liest die CSV-Datei zeilenweise ein und speichern Sie die Zeile in der variable $line, dann split jede Zeile in eine Liste von Spalten (variable $Spalten). Als Nächstes wählt er aus der angegebenen Spalte und der zugewiesene $columnValue variable. Wenn eine übereinstimmung vorhanden ist, drucken Sie die original-line.
InformationsquelleAutor der Antwort Hai Vu
Mit
awk
:Edit: Als pro Dennis Williamson ist ausgezeichneter Kommentar, das könnte viel mehr sauber (und sicher) geschrieben, durch die Festlegung awk-Variablen mit den
-v
Schalter:Herrgott...mit Variablen, und alles, awk ist fast eine echte Programmiersprache...
InformationsquelleAutor der Antwort Nate Kohl
Für Situationen, in denen die Daten enthalten keine Sonderzeichen, die Lösung von Nate Kohl und ghostdog74 ist gut.
Wenn die Daten enthält, die durch Kommas oder Zeilenumbrüche innerhalb der Felder, awk, möglicherweise nicht korrekt zählen das Feld zahlen und du bekommst falsche Ergebnisse.
Können Sie immer noch verwenden, awk, mit etwas Hilfe von einem Programm, das ich schrieb, genannt csvquote (erhältlich bei https://github.com/dbro/csvquote):
Dieses Programm findet Sonderzeichen im inneren zitiert Felder, und vorübergehend ersetzt Sie durch nicht druckbare Zeichen, die nicht zu verwechseln awk. Sie erhalten dann wiederhergestellt, nachdem awk ist getan.
InformationsquelleAutor der Antwort D Bro
InformationsquelleAutor der Antwort ghostdog74
Einen
sed
oderawk
Lösung wäre wahrscheinlich kürzer sein, aber hier ist eine für Perl:wo
<INDEX>
ist 0-basiert (die 0 für die erste Spalte, 1 für 2. Spalte, etc.)InformationsquelleAutor der Antwort mob
Ich war auf der Suche nach einer eleganten Lösung, die Unterstützung Angebotserstellung und würde nicht erfordern die Installation etwas Phantasie auf meinem VMware vMA appliance. Stellt sich heraus, das einfache python-Skript funktioniert der trick! (Ich nannte das Skript
csv2tsv.py
da es wandelt CSV in tab-getrennte Werte - TSV)Tab-getrennten Werte können leicht gespalten werden mit dem Befehl Ausschneiden (kein Trennzeichen angegeben werden muss, tab ist default). Hier ist ein Beispiel für die Nutzung/output:
In meinen Skripten bin ich eigentlich vor sich geht, analysiert tsv-Ausgabe Zeile für Zeile und verwenden, Lesen Sie oder schneiden, um die Felder, die ich brauche.
InformationsquelleAutor der Antwort Thomas Guyot-Sionnest