Wie kann ich extrem groß analysieren (70+ GB).txt-Dateien?

Ich habe mehrere .txt Dateien mit jeweils >30 Millionen Zeilen und irgendwo zwischen 20 und 40 "Spalten" (einige kommagetrennte, einige durch Leerzeichen getrennte, alle ASCII mit Zeilen, die durch eine neue Zeile getrennt sind). Ich brauche nicht alle (oder sogar die meisten) Spalten, und einige von ihnen haben Nullzeichen, die mit NULL gefüllt sind.

Meine Ziele sind:

  1. Entferne die Spalten, die ich nicht brauche
  2. Ordnen Sie die Spalten nach Belieben neu an (zur besseren Lesbarkeit)
  3. Pipe-Ausgabe an einen anderen .txt-Datei, mit Spalten, die durch Doppelpunkte getrennt sind

Ich habe dies gerade mit einer großen Textdatei getan, indem ich sie in ~40 .txt Dateien mit jeweils 1.000.000 Zeilen aufteilte, sie einzeln in Excel importierte und VERKETTETE, aber dieser Ansatz hat keine Früchte gebracht mit meinem nächsten Ziel. Die Datei ist durch Kommas getrennt, muss aber immer noch von .txt in .csv konvertiert werden, und Excel drosselt sie während des Importvorgangs. selbst wenn ich es in Excel habe, zerfällt die Hauptdatei in mehr als 200 kleinere Dateien zu befolgen Sie die Obergrenze von Excel, und das Gleiche mehr als 200 Mal zu tun, ist nicht effizient.

Ich arbeite an einem MacBook Pro Ende 2020 und bin in keiner Programmiersprache versiert genug, um überhaupt zu wissen, wo ich anfangen soll, aber ich bin halb bequemes Scripting in Shell und immer nach unten, um neue Tricks zu lernen, weiß einfach nicht, wo ich anfangen soll.

Author: JW0914, 2020-12-20

9 answers

Wählen Sie Ihre Werkzeuge

Es scheint, dass Excel kein geeignetes Werkzeug für das ist, was Sie tun möchten.

Ein Ansatz wäre, ein anderes Werkzeug zu verwenden, um die Daten zu konsolidieren oder zusammenzufassen. awk, sed, grep oder perl eignet sich möglicherweise besser für diese Erstverarbeitung und erstellt eine kleinere CSV-Datei, die dann in Excel oder anderen Tools verarbeitet werden kann.

Es gibt andere Werkzeuge, die besser geeignet sein können, die ganze Arbeit zu tun. Vielleicht so etwas wie R oder ein DBMS. Es hängt davon ab, was sie möchten mit den Daten zu tun.

Um einfach eine Reihe unterschiedlicher Textdateien zu nehmen und Spalten neu zu ordnen und auszuwählen, würde ich sofort zu perl springen. Andere würden awk.

Da Tools wie awk und perl Dateien Zeile für Zeile verarbeiten können und nicht alles im Speicher speichern müssen, können sie große Dateien verarbeiten, die andere Tools ersticken würden. Sie können auch überraschend schnell sein.


Nur zum Spaß, ein Beispiel

Mit diesen Daten

Apples,27,500,10.2,fruit,100,200,300
Chairs  1   501 123.78  furniture 101   201 301
Europe, 655, 502,0.0001,continent,   102, 202,302 

Wir können erzeugen Sie diese Ausgabe

fruit:Apples:10.2
furniture:Chairs:123.78
continent:Europe:0.0001

Mit diesem Befehl

perl -l -n -e "print join(':',(split(/[, \t] */))[4,0,3])" *.txt

Erklärung

element was, es tut
-l Fügen Sie nach jedem Druck eine neue Zeile hinzu
-n Zeile für Zeile verarbeiten, aber nicht implizit drucken
-e was folgt, ist ein Programm zum ausführen
print drucken Sie das Ergebnis der folgenden Ausdruck
join(":" Liste) Erstellen Sie eine Zeichenfolge aus einer Liste, verwenden Sie": "zwischen jedem
split (/expr/) Verwenden Sie den Ausdruck, um die Zeile in Felder zu unterteilen
[, \t] entweder ein Komma, ein Leerzeichen oder ein Tab, gefolgt von
* (Raum Sternchen) 0,1 oder mehr Leerzeichen
(Liste)[4,0,3] Wählen Sie das 4., 0. und 3. Element aus einem Liste

Das einzeilige Programm entspricht dem Folgenden, was möglicherweise einfacher zu befolgen ist

#!perl
use warnings;
use strict;

while(<>) {  # read line by line all input or all listed files
    my @columns = split(/[, \t] */);   # split on whitespace or commas
    my @chosen = @columns[4,0,3];      # choose what to keep
    my $new_line = join(":", @chosen); # join items using colons between
    print "$new_line\n";               # print with line-separator
}

Aufgerufen als perl data.pl *.txt > newdata.txt

Ich mag perl und bin mäßig vertraut mit einem Teil davon, obwohl es schwindet in der Popularität zum Teil, weil es ist einfach zu schreiben perl Programme, die sind sehr schwer zu Lesen. Es wurde jedoch genau für Ihren Anwendungsfall entwickelt. Jeder, der mit awk, python, ruby oder eines einer großen Anzahl von Tools würde dies nur lösen so leicht.

 62
Author: RedGrittyBrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-23 10:38:34

OS agnostic Antwort:

Lerne nur ein kleines bisschen Python und du wirst ein Werkzeug haben, um ähnliche Konvertierungen auf jede gewünschte Weise durchzuführen.

Geben Sie dies in eine Datei ein und speichern Sie es als zB cvt.py (ursprünglich basierend auf Code von hier)

import sys

exportcolumns = [3, 4, 5]
with open(sys.argv[1], 'r') as fi:
    for line in fi:
        columns = line.split(',')
        print( '\t'.join( columns[col] for col in exportcolumns) )

Nach der Installation von Python (version 3, sonst nichts!) Sie sollten in der Lage zu führen Sie die oben
Python3 cvt.py filename >newfile
wobei filename eine Ihrer Datendateien ist und newfile dort ist, wo Sie das Ergebnis haben möchten.

Wie geschrieben code sucht nach , als Spaltentrennzeichen, gibt Spalten 3,4,5 (in dieser Reihenfolge) mit Registerkarten \t als Trennzeichen (am Ende jeder Spalte) aus.


Wenn Sie eine komplexere (inkonsistentere) Spaltentrennung haben, können Sie

import re

... wie hier gezeigt: https://stackoverflow.com/a/4998688/3720510


Kurze Erklärung für das Obige

  • Die erste Zeile stellt das Modul sys zur Verfügung. Dies ermöglicht die Verwendung von sys.argv hier; Herstellung der Befehlszeilenargumente für die skript als einfache Liste.
  • In der zweiten Zeile wird eine Liste mit den Indizes der Spalten erstellt, die aus den Eingabedaten extrahiert werden sollen.
  • Die with-line öffnet die Datei und stellt sie während der folgender eingerückter Block-die Datei wird geschlossen, wenn der Block ausgef.
  • for-Schleife einmal für jede Zeile, die aus der Datei gelesen werden kann.
  • Nächste Zeile; Erstellen Sie eine Liste mit jeweils einer Inhaltszeile ,.
  • Der Druck; verwendet ein "Listenverständnis", um die Spalten aus der Liste auszuwählen, sie mit \t (einem Tabulatorzeichen) zwischen ihnen zu verbinden und sie dann zu drucken sys.stdout (implizit mit print ()) , was eine Datei sein kann - wenn Sie mit > in der Befehlszeile umgeleitet haben.

 33
Author: Hannu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2021-01-31 08:54:52

Haftungsausschluss: Ich habe dies nicht mit einer 70 GB-Datei versucht, aber ich habe ein paar GB und mehr als 4 Millionen Zeilen gemacht.

Der beabsichtigte Workflow für große Dateien besteht nicht darin, die gesamte Datei in ein Blatt zu laden, sondern eine Verbindung zur Datei herzustellen.

Öffnen Sie die Registerkarte Daten, wählen Sie "Aus Text / CSV" und wählen Sie Ihre Datei aus. Wenn der Vorschaudialog angezeigt wird, klicken Sie auf die Schaltfläche Caret außer " Laden "und wählen Sie"Nur Verbindung erstellen". Das ist es. Hier ist ein ausführlicheres Tutorial: https://excel.officetuts.net/en/examples/open-large-csv

Es könnte einige Macken und mehr Herausforderungen geben, die mit den Spaltentransformationen zu lösen sind, aber es lohnt sich, es auszuprobieren, wenn Sie sich in Excel viel besser fühlen als mit Befehlszeilentools.

Eine weitere Option - wenn Sie Zugriff haben, können Sie die Daten auch dort importieren und verarbeiten. Diese Software ist das Datenbanksystem für Power-User.

Davon abgesehen würde ich awk für die jeweilige Aufgabe auswählen. Aber du sollte dann zumindest etwas bequem mit Shell sein.

 15
Author: Džuris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-20 17:35:59

Wenn Ihr Datenformat bekannt ist (CSV oder eine andere durch Zeichen getrennte Datei, JSON usw.) können Sie in der Regel ein general-purpose command-line-tool zur Abfrage der.

  • xsv ist ein beliebtes für kommagetrennte / durch Leerzeichen getrennte Daten
  • jq ist beliebt für JSON-Daten (Download verfügbar hier)

Xsv kann durch Hunderte von MB pro Sekunde kauen abhängig von Ihrer Hardware und der Art der Abfrage.

 9
Author: Scott Minor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-21 07:32:37

Viele gute Ratschläge von anderswo über die Mechanik der Datenextraktion, aber Sie werden einige schmutzige Codierungsfähigkeiten brauchen, um etwas Nützliches damit zu tun.

Große Datensätze enthalten häufig beschädigte Zeilen, Loopy-Daten, seltsame Zeichen, Ohs anstelle von Nullen und jede Art von Formatierungsstörungen. Sie müssen überprüfen und filtern, was Sie haben. (Beispiel. Teilen Sie eine Datei in zwei Teile und verbinden Sie sie. Es kann durchaus die subtilsten Fehler am Join geben. Vielleicht ganz normal zeilen sind CRLF, aber am Ende ist das Zeilenende nur CR. Dies kann unbemerkt bleiben oder sogar dazu führen, dass das Einlesen das Ende der Datei annimmt!) Als Minimum würde ich sicherstellen, dass Sie genau die gleiche Anzahl von Zeilen ausgeben, wie Sie lesen.

Noch in der zeilenweisen Verarbeitung ist es sehr einfach und lohnenswert, den Daten eine sehr grundlegende Überprüfung der Vernunft hinzuzufügen. Selbst wenn ein Feld nicht ausgegeben wird, wenn es einfach zu überprüfen ist, tun Sie es, da dies auf subtilere Probleme hinweisen kann. Bewusst sein diese tatsächlichen Daten entsprechen möglicherweise nicht den offiziellen Spezifikationen. Warum erscheint manchmal ein Preis von -1? Ein besonders nützliches Feld zum Überprüfen ist das letzte, das immer etwas enthalten sollte, oder das letzte in jeder Zeile.

Protokollverarbeitung irgendwo. Auf diese Weise können Sie den laufenden Prozess einstellen und zum Mittagessen gehen. Sie haben eine Aufzeichnung, welche Version Ihres Programms verwendet wurde, um welche Ausgaben zu erstellen. Natürlich suchen Sie '...linien abgelehnt: 0 ' die ganze Zeit.

Schlechte Quellzeilen sollten sein ausgabe in eine Fehlerdatei. (Aber beenden Sie nach 15 Zeilen.) Sie können eine kleine Datenmenge visuell untersuchen, um zu sehen, welche Art von Verrücktheit Sie haben.

Es kann gut sein, dass Sie innerhalb der Schleife, die jede Zeile verarbeitet, Filter anwenden müssen. Dies geschieht möglicherweise nicht beim ersten Durchgang, aber im Verlauf der Downstream-Analyse werden Sie möglicherweise aufgefordert, einen ausgewählten Datensatz anzugeben. Z. schließen Sie Zeilen mit Produkten mit "test" im Namen oder Produktcode ab 9 aus.

Eine oft vermisste Validierungsproblem sind fehlende oder doppelte Daten. Zum Beispiel wurden die Rohdaten vom Freitag bis zum Ende des Donnerstags hinzugefügt, und der Freitag stammt aus der Vorwoche. Woher wird es jemand wissen? Das Netzwerk schlug von 15 bis 17 Uhr fehl, sodass nichts aufgezeichnet wurde. Montag war ein Feiertag, an dem es keine Transaktionen geben sollte, aber jemand hat Daten vom vorherigen Montag geliefert. Sie sind in einer guten Position, um einige einfache Summen zu machen,zum Beispiel Tagesumsatz oder maximale Periode ohne Aktivität usw. Dies sind Bulk-Sanity-Checks, die verwendet werden, um eine menschliche Denkpause einzulegen und zur Überprüfung aufzufordern, bevor vergiftete Daten weiter in der Kette weitergegeben werden. Es ist wahrscheinlich nicht Ihre Aufgabe zu entscheiden, was mit einem Loopy-Batch zu tun ist, aber Sie können es hervorheben und wahrscheinlich Ihren Code optimieren, um einen besseren Datensatz zu erhalten.

Alle oben genannten ist 'einfach', einen schritt zu einer Zeit programmierung. Sie lernen Automatisierung, aufgeräumte Workflows, Loopy-Formatierungen und grundlegende Datenanomalien kennen. Sie werden auch ein bisschen Experte für ungewöhnliche Daten erkennen und was die Felder bedeuten sollen. Das wird nützlich sein für...

Etwas Nützliches mit den Daten machen. Sie sollten an der Downstream-Analyse beteiligt sein. Dies soll nicht vorschlagen, dass Sie Analysen in Ihr Übersetzungsprogramm integrieren sollten, aber Sie haben ein Framework bereit, dies zu tun. Summen, Durchschnittswerte, max und min, stündlich, täglich, wöchentlich sind alle möglichen einfachen (NB automatisierten) Ausgaben. Sie könnten denken, eine Datenbank ist ein besseres Werkzeug, aber für fummelige Dinge einfach codierung kann besser sein. Lassen Sie mich ein Beispiel geben: Glätten Sie eine Reihe von Datenpunkten. Ein einfacher gleitender Durchschnitt ist nextPoint = (lastPoint *(0.8)) + (rawValue *(0.2)) [].8 und .2 zu entsprechen]. Das ist in Ordnung für kontinuierliche Daten, aber was ist mit dem Start des Geschäfts jeden Tag? Das ist ein Sonderfall, in dem nextPoint = rawValue. Etwas zu codieren vielleicht.

Falsche Datenwerte sind ein gutes Beispiel für die Kreuzung zwischen Rohdaten-Crunching und Analyse. Wenn jemand £ 175 schlug, als er £1.75 bedeutete wollen wir das wirklich in unsere Analyse einbeziehen? Es ist ein bisschen eine Kunst, oder Fudge, aber der Rohdatenprozessor kann leicht eine mittlere und Standardabweichung für ein paar tausend Datenpunkte oder eine tatsächliche Verteilung für alle Datenzeilen berechnen. Sie/ möchten / möchten unerwartete Werte in der Phase des Daten-Knirschens wegwerfen, markieren, hervorheben oder auf andere Weise darauf aufmerksam machen oder sie verwenden, um die Analysephase zu informieren. Fügen Sie möglicherweise eine weitere Spalte mit einem Leerzeichen für OK und 'H' für höher als erwartet hinzu und also weiter.

Sie werden ein erfahrener Handwerker, der in der Lage ist, einen riesigen Baum von Anfang bis Ende in nützliche Planken zu verwandeln. Sie erfahren, wer welche Bretter zu welchem Zweck haben möchte und können das Rohholz richtig aufsägen, um Spaltungen und Erschütterungen zu vermeiden. Wenn Sie außerdem einen erkrankten Baum erkennen, können Sie Alarm schlagen.

 4
Author: Peter Fox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-21 13:45:06

Ich verwende keine Macs, aber unter der Annahme, dass die Standard-UNIX-Tools verfügbar sind, dann

  1. Terminal öffnen
  2. geben Sie cd ein und ziehen Sie in den Ordner mit den Dateien
  3. geben Sie awk -v FS=, -v OFS=, '{ print $3, $2, $5 }' < source.txt > dest.txt

Beachten Sie das Leerzeichen nach cd und die Verwendung einfacher Anführungszeichen mit dem Befehl awk. Für beide Befehle ist der Fall (oben/unten) wichtig.

Dies liest die gesamte CSV-Datei source.txt ein und druckt die dritte, zweite und fünfte Spalte als CSV-Datei, dest.txt

AWK wurde in erster Linie für Textdateien entwickelt, die Daten in Spalten enthalten. Das -v setzt die Ein-und Ausgabespaltentrennzeichen auf ein Komma

Sollten Sie nicht weiterkommen, haben wir ein Mac-spezifisches Forum, Stellen Sie verschiedene , die für Ihre Frage besser geeignet sind.

 2
Author: CSM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-31 12:25:36

Wie immer haben Sie zwei Möglichkeiten zu wählen.

A. Machen Sie ein ziemlich komplexes Programm (Mehrfachauswahl von Trennzeichen,Mehrfachauswahl der Datenverarbeitung usw.)

B. Verwenden Sie einen" Unix Toolbox " - Ansatz. Lernen Sie einige Tools kennen, die Sie in jedem Unix-oder Unix-ähnlichen System zur Verfügung haben (macOS war einmal zertifiziertes Unix-System, Sie sollten alles bereits zur Verfügung haben). Es ist etwas Aufwand nötig, aber es lohnt sich.

Wenn Sie dem A. Way folgen möchten, gibt es viele Sprachen zur Auswahl. Für den Zweck wäre Perl großartig, Python ist jetzt eine trendige Option, aber es gibt noch viel mehr...

Wenn Sie dem B. Way folgen möchten, würde ich einen ruhigen Start und etwas Geduld vorschlagen. Ich liebe ein Buch namens Classic Shell Scripting, ich benutze es sogar in Kursen, die ich unterrichte...

Ich denke, du brauchst einen Schritt zurück. Vor dem 1. sie benötigen eine Art Schritt:

  1. Vermeide unnötiges Durcheinander. Sie können Dateien in ein gemeinsames Trennzeichen konvertieren, wenn dies möglich ist. Ja, es kann das sein erster Befehl in einer Pipe.

Dann können Sie mehr Befehle in der Pipe verwenden (cut könnte eine gute Option sein, oder awk - es wäre sogar in der Lage, Spalten auszuwählen, ihre Reihenfolge zu ändern und das richtige Trennzeichen in einem Schritt festzulegen).

 1
Author: d.c.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-21 00:01:44

Wenn Sie die integrierten Befehle in Windows verwenden möchten, anstatt etwas anderes wie awk, Python oder Perl herunterzuladen (was viel besser ist) , können Sie immer nur die Windows - Eingabeaufforderung verwenden:

Https://ss64.com/nt/for_f.html

Auch hier schlage ich dies nicht als das "beste" Tool vor, aber wenn Sie Ihre Lösung vertreiben müssen oder nicht in der Lage sind, Software von Drittanbietern herunterzuladen, ist dies möglicherweise die beste Wahl.

 0
Author: throx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-21 04:39:45

Falls es Ihnen nichts ausmacht, ein paar Dollar auf die Lösung zu werfen, kann EmEditor extrem große Textdateien in einer Notepad++-ähnlichen Oberfläche verarbeiten. Früher habe ich das bei einer eDiscovery-Firma verwendet, die mit sehr großen Datensätzen arbeiten musste, und es war benutzerfreundlich genug für die Paralegals.

 0
Author: Iain Bagnall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-12-22 04:13:27