Richtig erkennen line-Endungen eine Datei in Perl?

Problem: ich habe Daten (meist im CSV-format) erzeugt, die auf Windows-und *nix und verarbeitet werden, meistens auf *nix. Windows verwendet CRLF für die Zeilenenden und Unix verwendet LF. Für eine bestimmte Datei, die ich weiß nicht, ob man windows oder *nix-Zeilenenden. Bis jetzt, ich habe das schreiben etwas wie dieses zu handhaben ist der Unterschied:

while (<$fh>){
    tr/\r\n//d;
    my @fields = split /,/, $_;
    # ...
}

Auf *nix \n Teil entspricht scharrt, und zusätzlich entledigt \r (CR) wenn es ein windows-produziert-Datei.

Aber jetzt will ich Text::CSV_XS b/c ich fange an, seltsamer Daten-Dateien mit zitiert Daten, die potenziell mit eingebetteten Zeilenumbrüche, etc. Um dieses Modul zu Lesen wie Dateien, Text::CSV_XS::getline() benötigt die Angabe der end-of-line-Zeichen. (Ich kann nicht Lesen, jede Zeile wie oben, tr/\n\ \ r//d und Sie analysieren es mit Text::CSV b/c, dass wäre nicht mit eingebetteten Zeilenumbrüche richtig). Wie kann ich richtig erkennen, ob eine beliebige Datei benutzt windows oder *nix-Stil Zeilenenden, so kann ich sagen, Text::CSV_XS::eol (), wie chomp()?

Konnte ich nicht finden, ein Modul auf CPAN, die einfach erkennt Zeilenenden. Ich will nicht zuerst konvertieren alle meine datafiles über dos2unix, b/c die Dateien sind sehr groß (Hunderte von gigabytes), und verbringen 10+ Minuten für jede Datei, befassen sich mit etwas, das so einfach scheint albern. Ich dachte über das schreiben einer Funktion, die liest die ersten paar hundert bytes einer Datei und zählt LF vs CRLF, aber ich weigere mich zu glauben, dass dies nicht eine bessere Lösung.

Hilfe?

Hinweis: alle Dateien sind entweder vollständig von windows-Zeilenenden oder *nix-Endungen, das heißt, Sie sind nicht beide gemischt in einer einzigen Datei.

InformationsquelleAutor user1481 | 2012-08-28
Schreibe einen Kommentar