Parsen von Textdateien

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

Ein weiteres meiner Ziele war es, Code vor und nach dem Wort in jede Zeile zu setzen.

aardvark
apple
azolio

Würde sich in

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 in Windows auszuführen XP?

Author: Joe Phillips, 2009-08-22

13 answers

Um den SQL-Text hinzuzufügen, können Sie diese Eingabeaufforderung einmal ausprobieren:

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

Um Zeilen in einer Textdatei mit mehr als 7 Zeichen herauszufiltern, können Sie ein anderes Befehlszeilentool verwenden, findstr:

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

Die Option / r gibt an, dass Sie die Regex-Übereinstimmung verwenden möchten, und die Option /v weist sie an, Zeilen zu drucken, die nicht übereinstimmen. (Da es scheint, dass findstr es Ihnen nicht erlaubt, einen Zeichenzahlbereich anzugeben, habe ich ihn mit dem Muster "8 oder mehr" und dem "nicht übereinstimmen" Option.)

 10
Author: bobbymcr,
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
2009-08-22 06:14:27

Perl Fügen Sie dieses Skript einfach ein und führen Sie es im selben Verzeichnis wie die Wortliste aus. Ändern Sie Ihren Wortlistennamen in Wörter.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 (Schlagsahne es schnell zusammen, kann ein gutes Stück abgehackt werden):

open FILE, "words.txt" or die $!;

my @words = <FILE>;

foreach $word(@words)
{
    print $word if(length($word) <= 8);
}
 6
Author: John T,
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
2009-08-22 05:08:53

Sie können die GNUWin32 sed für Windows XP.
Ähnlich AWK und Perl auch.
Das ist, wenn Sie an Unix-Skripte gewöhnt sind (wenn ja, berücksichtigen Sie auch Cygwin).

Ansonsten gibt es auch PowerShell.

 4
Author: nik,
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
2009-08-22 04:50:59

GVim ist ein würdiges Bearbeitungswerkzeug, das seinen Ursprung in dem ehrwürdigen vi hat, das auf Unix-Systemen verwendet wird. Sie möchten den Befehl substitute verwenden, um für jedes Wort global zu suchen/zu ersetzen.

AWK und Perl sind sehr mächtige Werkzeuge, aber Overkill für das, was Sie brauchen. Sie werden gVim genießen, da es in erster Linie ein Editor ist. Die Sache, die mit gVim rockt, ist, dass Sie nur einen Tastendruck davon entfernt sind, ihm einen Such - /Ersatz - /Ersetzungsbefehl zu geben die mit dem robusten Format für reguläre Ausdrücke angegeben werden kann.
Glück.

 4
Author: Rolnik,
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
2011-03-09 21:20:52

Massiv unterschätzt als Entwicklungstool ist Microsoft Excel (oder Openoffice-Tabellen). Es gibt eine maximale Anzahl von Zeilen, aber möglicherweise können Sie eines dieser Tools nutzen.

Dann können Sie einfach links, Mitte, wenn usw. verwenden. funktionen in der Tabelle in Formeln, die rechts neben Ihren Zeilen stehen. Sie werden automatisch mit relativen Referenzen kopiert.

Oft ist es viel einfacher als das Codieren, es sei denn, Sie sind ein Codierer :) Von dort aus können Sie importieren, export, und tun eine Menge cooler Dinge auch mit Text.

 3
Author: Dan Rosenstark,
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
2009-08-22 10:59:31

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

Das Herunterladen von Python und das Durchlaufen des Tutorials dauert einige Stunden, aber danach werden Ihnen solche Aufgaben sehr einfach erscheinen. Besser noch, Sie werden lernen, Aufgaben zu erkennen " auf der Suche nach einigen programmierung" auch in anderen Bereichen, und es wird Ihre Produktivität verzehnfachen.

 2
Author: Eli Bendersky,
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
2017-05-23 12:41:37

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 wie:

  ^[[:alpha:]]{7,}\n

Und durch nichts ersetzen.

 2
Author: Umber Ferrule,
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
2009-08-22 13:25:34

Dein Ausdruck ist falsch. Du willst das:

^.{0,6}$

 1
Author: Joel Coehoorn,
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
2011-03-09 22:22:25

Ich weiß, diese Antwort ist spät, aber ich denke, es ist Wert hinzufügen dennoch. Für das, was es wert ist, können Sie diese Textdatei auch ganz einfach mit Notepad++ und regulären Ausdrücken analysieren.

Du hast gesagt, dass du die folgende reguläre Expression benutzt hast, aber es hat nicht funktioniert:

.{6,}

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

Wie groß ist die Textdatei? Notepad++ kann eine Weile dauern, um reguläre Ausdrücke auf sehr auszuführen große Dateien, so ist es möglich, es war nicht fertig Verarbeitung.

Hinweis: Sie geben an, dass Ihr Ziel darin bestand, Zeilen mit mehr als 7 Zeichen zu entfernen - dazu sollten Sie den Ausdruck .{8,}

Wenn Sie sicher sind, dass dieser Ausdruck nicht funktioniert hat, sind Sie sicher, dass Ihr Suchmodus auf regulären Ausdruck eingestellt war und dass ". "newline" wurde nicht gesetzt?

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

Entfernen Sie alle Zeilen länger als 7 Zeichen Führen Sie ein Suchen und Ersetzen in Notepad++ mit dem folgenden Ausdruck aus:

Find what:      .{8,}\r?\n?
Replace with:

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

Ersetzen Sie Wörter durch Code

Angenommen, jede Zeile enthält einfach ein Wort (und keine Leerzeichen oder unerwünschten Zeichen usw.).) dies kann auch durchgeführt werden mit einem einfachen suchen und ersetzen":

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
 1
Author: Joshua Cole,
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
2018-04-11 10:01:19

Ich benutze dafür Excel.

Setzen Sie alle Ihre Wörter in Spalte A.

Setzen Sie diese Formel in Spalte B:

=IF(LEN(A1)>7,"",CONCATENATE("INSERT INTO Worte (word) VALUES ('",A1,"')"))

Kopieren Sie die Formel in alle Zeilen.

Jede Zeile in Spalte B hat Ihren SQL-Einfügebefehl, wenn die Länge des Wortes kleiner als 7 ist. Andernfalls wird es leer sein.

Wenn Sie die Leerzeilen entfernen möchten, kopieren Sie sie und fügen Sie sie als Werte Spalte B in eine andere ein spalte, dann sortieren Sie einfach die Spalte. Die Leerzeilen werden nach unten gedrückt.

 0
Author: ,
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
2009-08-22 15:49:22

Dies kann mit einem Perl-Einzeiler erfolgen (wobei jedes Wort länger als 7 Zeichen entfernt wird):

perl -nle "print if length($_) <= 7" "D:\temp2\input.txt" > ShortWords.txt

Fügen Sie dies in eine BAT-Datei ein oder führen Sie es direkt über einen Befehl aus zeilenfenster (Run / cmd).

Perl muss installiert sein. Ich benutze ActivePerl - es ist sehr einfach zu installieren, da es ein normales Windows-Installationsprogramm. Direkte Download-URL.

Für den zweiten Teil Ihrer Frage (Generieren der SQL-Befehle): Es ist nur ein erweiterung des ersten Perl einzeiler:

perl -nle "print 'INSERT INTO Words (word) VALUES (\'' . $_ . '\');' if length($_) <= 7" "D:\temp2\input.txt" > SQLcommands.txt

Wenn es komplizierter wird, dann ist es wahrscheinlich besser, mit einem normales Perl-Skript, wie von John T.

 0
Author: Peter Mortensen,
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
2009-08-25 18:43:16

Ob Sie es glauben oder nicht, aber Microsoft Word hat tatsächlich auch reguläre Ausdrücke. STRG+H > Mehr > Wild card. Der Suchausdruck wird wahrscheinlich so etwas wie [.]{8+} - drücken Sie F1, während der Such - / Ersetzungsdialog angezeigt wird, um eine Beschreibung der regulären Ausdrücke von Word anzuzeigen.

 0
Author: ccpizza,
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
2011-03-28 19:33:12

Sie können das ohne zusätzliches Werkzeug lösen, indem Sie ein wenig VBScript oder ein Excel VBA Makro verwenden. Dies ist in der Tat eher eine Frage für stackoverflow.com. Der Code für dieses Skript würde auch in Excel VBA fast unverändert ausgeführt.

Ein Beispiel-VBA (nicht getestet) könnte sein:

Sub filterRows()  
     Dim InputData  
     Open "c:\test.txt" For Input As #1    ' Open file for input.  
     Open "c:\out.txt" For Output As #2  
     Do While Not EOF(1)             ' Check for end of file.  
        Line Input #1, InputData    ' Read line of data.  
        If Len(InputData) <= 7 Then  
            Print #2, InputData  
        End If  
     Loop  
     Close #1    ' Close file.  
     Close #2  

End Sub 
 0
Author: Patrick Honorez,
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
2014-12-18 21:19:38