2009-04-15 13 views
3

Ich muss Perl in einer Windows-Umgebung bei der Arbeit verwenden, und ich muss in der Lage sein, die Anzahl der Zeilen, die eine große CSV-Datei enthält (etwa 1,4 GB) zu finden. Irgendeine Idee, wie man das mit minimaler Verschwendung von Ressourcen macht?Wie zähle ich die Anzahl der Zeilen in einer großen CSV-Datei mit Perl?

Dank

PS Dies muss im Skript Perl getan werden und wir keine neuen Module auf dem System installiert werden dürfen.

+1

„Nicht erlaubte neue Module zu installieren“ ist in der Regel ein konzeptioneller Mythos. http://StackOverflow.com/Questions/755168/Perl-Myths/755179#755179 –

Antwort

9

Ja, nicht Perl verwenden.

Verwenden Sie stattdessen das einfache Dienstprogramm zum Zählen von Zeilen; wc.exe

Es ist Teil einer Reihe von Fenster Dienstprogramme von Unix-Vorlagen portiert.

http://unxutils.sourceforge.net/

Zum Beispiel;

PS D:\> wc test.pl 
    12  26  271 test.pl 
PS D:\> 

Wobei 12 == Anzahl der Zeilen, 26 == Anzahl der Wörter, 271 == Anzahl der Zeichen.

Wenn Sie wirklich Perl verwenden müssen;

D:\>perl -lne "END{print $.;}" < test.pl 
12 
+1

Sicher, WC wäre der Weg zu gehen * Nix, wo es bereits installiert sein wird - aber ist es wirklich wert, eine separate ausführbare Datei zu downloaden etwas tun, das kurze Linie von Perl dauert? –

+0

Ja, denn Cygwin ist ein Muss für jede Windows-Entwicklungsumgebung. – KenE

+1

Dies ist nicht Cygwin, aber immer noch ein Muss. Das Zählen von Zeilen in einer Datei ist eine so häufige Aktivität, dass es sich lohnt, dieses Dienstprogramm zu verwenden. –

14

Meinst du Zeilen oder Zeilen? Eine Zelle kann Zeilenumbrüche enthalten, die der Datei Zeilen hinzufügen, aber keine Zeilen. Wenn Sie sicher sind, dass keine Zellen neue Zeilen enthalten, verwenden Sie einfach die Technik in der Perl FAQ. Andernfalls benötigen Sie einen geeigneten CSV-Parser wie Text::xSV.

+0

Ich entschuldige mich, ich meinte Reihen. –

+1

Sie sollten Ihre Frage ändern, da jeder andere Kommentar nur Zeilen zählt. – jiggy

+0

+1, guter Punkt, aber es ist auch erwähnenswert, dass es kein "offizielles" CSV-Format gibt - nur eine Sammlung von locker definierten, etwas inkompatiblen Formaten, die nicht übereinstimmen, wie man Kommas zitiert und ob Zeilenumbrüche erlaubt sind Zellen. Viele Tools nehmen eine Zeile == 1 Zeile an. –

4

Dies liest nur eine Zeile zu einer Zeit, so dass es keinen Speicher verschwendet, wenn jede Zeile enorm lang ist.

+0

Linien sind nicht dasselbe wie CSV-Zeilen. Denken Sie beispielsweise an Felder mit eingebetteten Zeilenumbrüchen. –

+0

@brian: Das stimmt. Aber es ist auch wahr, dass die Arbeit mit CSV-Dateien, die Felder mit eingebetteten Zeilenumbrüchen enthalten, schmerzhaft sein wird, weil es keine universelle Übereinkunft über Tools gibt, ob und wie solche Dinge kodiert werden sollen - leider ist CSV kein "Standard". –

0

Upvote für edgs Antwort, eine andere Option ist cygwin zu installieren, um wc und eine Reihe anderer nützlicher Dienstprogramme unter Windows zu erhalten.

+0

IME, fügt Cygwin zu viel Komplikation hinzu, außer Sie möchten eine Pseudo-Unix-Umgebung ausführen. MinGW und MSYS bieten ein leichteres System, das sich gut für die Softwareentwicklung eignet. Für einfache Kommandozeilen-Tools bietet GnuWin32 eine gute Auswahl an Tools mit geringen Auswirkungen, einfache Installer. – daotoad

+0

Danke für den Tipp - ich werde es mal ausprobieren! – KenE

+0

wc ist nicht die Antwort, da es Zeilen zählt, die nicht einer CSV-Zeile entspricht. Siehe Axemans Antwort. –

3

Diese Einzeiler Griffe neue Linien innerhalb der Reihen:

  1. Betrachtet man Linien mit einer ungeraden Anzahl von Zitaten.
  2. In Anbetracht dieser doppelten Anführungszeichen ist eine Möglichkeit, Anführungszeichen innerhalb des Feldes anzuzeigen.
  3. Es verwendet die super Flip-Flop-Operator. Betrachten

    perl -ne 'BEGIN{$re=qr/^[^"]*(?:"[^"]*"[^"]*)*?"[^"]*$/;}END{print"Count: $t\n";}$t++ unless /$re/../$re/' 
    

:

  • wc nicht zur Arbeit zu gehen. Es ist großartig für das Zählen von Linien, aber nicht CSV Zeilen
  • Sie sollten installieren - oder kämpfen, um zu installieren - Text::CSV oder einige ähnliche Standard-Paket für die ordnungsgemäße Handhabung.
  • Das kann Sie trotzdem dorthin bringen.


EDIT: Es mir entfallen, dass dieses Fenster war:

perl -ne "BEGIN{$re=qr/^[^\"]*(?:\"[^\"]*\"[^\"]*)*?\"[^\"]*$/;}END{print qq/Count: $t\n/;};$t++ unless $pq and $pq = /$re/../$re/;" 

Das Seltsame ist, dass das Gebrochene O 'Shell && als O bedingte exec interpretiert und I couldn' t tue alles, um seine Meinung zu ändern !! Wenn ich es entkommen würde, würde es nur so in Perl übergehen.

-1

ich idiotisch wurde, die auf einfache Weise in dem Skript zu tun ist:

open $extract, "<${extractFileName}" or die ("Cannot read row count of $extractFileName"); 
$rowCount=0;  
while (<$extract>) 
{ 
    $rowCount=$rowCount+1; 
} 

close($extract); 
Verwandte Themen