Analysieren von Textdateien

7396
Joe Phillips

Ich bin heute Abend auf eine Situation gestoßen, in der ich eine Textdatei analysieren wollte. Ich hatte eine sehr, sehr lange Wortliste, die aus Zeilen bestehende englische Wörter enthielt. Ich wollte jedes Wort (oder jede Zeile) loswerden, das länger als 7 Zeichen war. Dies wäre unter Linux einfach, aber unter Windows XP scheint ich keine einfache Lösung zu finden. Ich habe versucht, Notepad ++ mit regulären Ausdrücken zu suchen, aber das war ein großer Fehler. Ich habe versucht, den Ausdruck .zu verwenden, ohne Übereinstimmungen zu finden. Ich bin wirklich ratlos, weil ich dachte, dass so etwas extrem einfach wäre und es eine Menge Werkzeuge geben würde, um eine solche Aufgabe zu erledigen. Es scheint, als würde Notepad ++ alle anderen Funktionen der Welt unterstützen, mit Ausnahme der grundlegendsten, die am offensichtlichsten erscheinen.

Ein weiteres Ziel war es, vor und nach dem Wort in jeder Zeile etwas Code einzufügen.

aardvark apple azolio 

würde sich in verwandeln

INSERT INTO Words (word) VALUES ('aardvark'); INSERT INTO Words (word) VALUES ('apple'); INSERT INTO Words (word) VALUES ('azolio'); 

Welche Vorschläge / Tools / Tipps haben Sie, um ähnliche Aufgaben wie in Windows XP auszuführen?

6

13 Antworten auf die Frage

9
bobbymcr

Um den SQL-Text hinzuzufügen, können Sie versuchen, diese Eingabeaufforderung in einer Zeile auszuführen:

(for /f %i in (words.txt) do @echo INSERT INTO Words ^(word^) VALUES ^('%i'^)) > words.sql

Um Zeilen in einer Textdatei herauszufiltern, die länger als 7 Zeichen sind, können Sie ein anderes Befehlszeilentool verwenden, findstr:

findstr /v /r ^.........*$ words.txt > shorter-words.txt

Die Option / r gibt an, dass Sie den Regex-Abgleich verwenden möchten. Mit der Option / v wird angegeben, dass Zeilen gedruckt werden sollen, die nicht übereinstimmen. (Da es scheint, dass es in findstr nicht möglich ist, einen Zeichenanzahlbereich anzugeben, habe ich ihn mit dem Muster "8 oder mehr" und der Option "Nicht übereinstimmen" vorgetäuscht.)

Das ist eigentlich ziemlich schnell und erstaunlich. Ich wusste nie, dass Sie dies mit der Windows-Eingabeaufforderung tun könnten! Joe Phillips vor 14 Jahren 0
Es gelang, den Befehl findstr in nur wenigen Sekunden auf einem 1,66-MB-Speicher auszuführen. Dann wurde der SQL-Anteil in weniger als einer Minute erledigt. Sehr beeindruckend. Joe Phillips vor 14 Jahren 0
6
John T

Sicherlich Perl, fügen Sie dieses Skript einfach ein und führen Sie es in demselben Verzeichnis wie die Wortliste aus. Ändern Sie den Namen Ihrer Wortliste in words.txt oder ändern Sie den Namen im Skript. Sie können die Ausgabe wie folgt in eine neue Datei umleiten:

words.pl > list.txt 

ohne weiteren Erfolg (schnell zusammen geschlagen, kann einigermaßen zerkleinert werden):

open FILE, "words.txt" or die $!;  my @words = <FILE>;  foreach $word(@words) { print $word if(length($word) <= 8); } 
4
nik

Sie können das GNUWin32 sedfür Windows XP bekommen.
Ähnlich AWKund Perlauch.
Das ist, wenn Sie an das Unix-Scripting gewöhnt sind (falls ja, denken Sie auch an Cygwin).

Ansonsten gibt es auch PowerShell.

4
Rolnik

gVim ist ein würdiges Bearbeitungstool, das seinen Ursprung in dem ehrwürdigen vi hat, das auf Unix-Systemen verwendet wird. Sie sollten den Ersatzbefehl verwenden, um globale Suchen / Ersetzen für jedes Wort durchzuführen.

AWK und Perl sind sehr leistungsstarke Tools, die jedoch für das, was Sie brauchen, übertrieben sind. Sie werden gVim genießen, da es in erster Linie ein Editor ist. Mit gVim rockt die Sache, dass Sie nur einen Tastendruck davon entfernt sind, ihm einen Befehl zum Suchen / Ersetzen / Ersetzen zu geben, der mit dem robusten Format für reguläre Ausdrücke angegeben werden kann.
Viel Glück.

3
Dan Rosenstark

Als Entwicklungswerkzeug massiv unterschätzt wird Microsoft Excel (oder OpenOffice Spreadsheets). Es gibt eine maximale Anzahl von Zeilen, aber Sie können möglicherweise eines dieser Tools nutzen.

Dann können Sie einfach die Funktionen left, mid, if usw. in der Tabelle in Formeln verwenden, die rechts von Ihren Zeilen stehen. Sie werden automatisch mit relativen Referenzen kopiert.

Oft ist es viel einfacher als das Codieren, es sei denn, Sie sind Programmierer. :) Von dort aus können Sie sogar mit Text importieren, exportieren und viele coole Dinge tun.

Ja, das Hauptproblem ist, dass es nur ~ 65500 Zeilen halten kann :( Joe Phillips vor 14 Jahren 1
dort gewesen, es ist ein Mist. hast du odesk ausprobiert :) Dan Rosenstark vor 14 Jahren 0
2
Eli Bendersky

Vielleicht ist dies besser für StackOverflow geeignet, da der beste Rat, den ich Ihnen geben kann, eine der Skriptsprachen ist, um solche Aufgaben zu erleichtern. Es ist viel besser, ein leistungsfähiges Werkzeug zu kennen als Dutzende von Kleinen, IMHO, und es ist eine Investition, die sich auszahlt.

Das Herunterladen von Python und das Durcharbeiten des Tutorials wird einige Stunden dauern, danach werden Ihnen solche Aufgaben jedoch sehr einfach erscheinen. Besser noch, Sie werden lernen, Aufgaben, die auf der Suche nach etwas Programmierung sind, auch in anderen Bereichen zu erkennen, und dies wird Ihre Produktivität verzehnfachen.

Ich kenne mich mit Skripting / Programmierung aus, denke aber nicht, dass es notwendig ist. Dies ist einer der Fälle, an denen ich versuche, mich an etwas zu gewöhnen, das keine Programmierlösung ist. Joe Phillips vor 14 Jahren 2
Warum? Wäre es nicht einfacher, es einfach zu programmieren? Sie können auch ein Skript behalten, das später wieder verwendet werden kann Eli Bendersky vor 14 Jahren 0
Dies ist eine theoretische Frage für die zukünftige Bezugnahme. Vielmehr hätte ich die Möglichkeit, ODER mit einem Werkzeug zu programmieren Joe Phillips vor 14 Jahren 1
2
Umber Ferrule

Ich würde dafür TextPad verwenden .

Ich habe es in der Vergangenheit ausgiebig für reguläre Ausdrücke verwendet.

Ich würde versuchen etwas zu finden:

 ^[[:alpha:]]\n 

Und durch nichts ersetzen.

1
Joel Coehoorn

Ihr Ausdruck ist falsch. Du willst das:

^. $

1
Joshua Cole

Ich weiß, dass diese Antwort spät ist, aber ich denke, es lohnt sich trotzdem hinzuzufügen. Sie können diese Textdatei auch ganz einfach mit Notepad ++ und regulären Ausdrücken analysieren.

Sie sagten, dass Sie die folgenden regelmäßigen Ausdrücke verwenden, aber es hat nicht funktioniert:

. 

Dieser Ausdruck sieht gut aus und sollte mit allen Zeilen übereinstimmen, die 6 oder mehr Zeichen enthalten.

Wie groß ist die Textdatei? Notepad ++ kann einige Zeit dauern, um reguläre Ausdrücke in sehr großen Dateien auszuführen. Daher ist es möglich, dass die Verarbeitung nicht abgeschlossen wurde.

Hinweis: Sie geben an, dass Sie das Ziel hatten, Zeilen mit mehr als 7 Zeichen zu entfernen. Zu diesem Zweck sollten Sie den Ausdruck verwenden.

Wenn Sie sicher sind, dass dieser Ausdruck nicht funktioniert hat, sind Sie sicher, dass Ihr Suchmodus auf "Regulärer Ausdruck" eingestellt ist und dass ". Entspricht Newline" nicht festgelegt wurde?

Um Ihr Problem zu lösen, würde ich die folgenden Schritte in Notepad ++ ausführen:

Entfernen Sie alle Zeilen, die länger als 7 Zeichen sind. Führen Sie eine Suche und ersetzen Sie sie in Notepad ++ mit dem folgenden Ausdruck:

Find what: .\r?\n? Replace with: 

Dadurch werden alle Zeilen entfernt, die länger als 7 Zeichen sind, und auch die Zeilenumbrüche und Wagenrücklaufzeichen, falls vorhanden.

Wörter durch Code ersetzen

Angenommen, in jeder Zeile steht einfach ein Wort (und keine Leerzeichen oder unerwünschten Zeichen usw.). Dies kann auch mit einem einfachen Suchen und Ersetzen erfolgen:

Find What: (.*) //Match the whole line, store in capture group Replace with: INSERT INTO Words (word) VALUES ('\1'); //reference value of capure group with \1 
0

Ich benutze diesmal mit Excel.

Setzen Sie alle Ihre Wörter in Spalte A.

Setzen Sie diese Formel in Spalte B:

= WENN (LEN (A1)> 7, "", CONCATENATE ("INSERT IN WORT (Wort) VALUE ('", A1, "')"))

Kopieren Sie die Formel in alle Zeilen.

Jede Zeile in Spalte B enthält den Befehl zum Einfügen von SQL, wenn die Länge des Wortes weniger als 7 beträgt. Andernfalls ist es leer.

Wenn Sie die leeren Zeilen entfernen möchten, kopieren Sie die Spalte B in eine andere Spalte und fügen Sie sie als Werte ein. Sortieren Sie dann die Spalte. Die Leerzeilen werden nach unten verschoben.

Diese Datei enthält + 150.000 Wörter. Ich glaube nicht, dass Excel es sogar öffnen wird. Joe Phillips vor 14 Jahren 0
Ja, Sie haben recht, Excel führt nur 65536 Zeilen. vor 14 Jahren 0
In Excel 2003 und früher gibt es diese Einschränkungen. Wenn Sie diese jedoch zur Verfügung haben, hat Excel 2007 diese Beschränkungen stark erhöht. Siehe http://office.microsoft.com/de-de/excel/HP100738491033.aspx. bobbymcr vor 14 Jahren 0