2017-08-07 1 views
-2

Ich mache eine große (8000 Zeilen) Bibliothek Datenkonvertierung. Ich lese eine Datei ein und möchte sie zeilenweise ändern. Das Lesen der Datei wird beendet, bevor das Ende der Datei erreicht wird.Mein Skript vermisst Zeilen beim Lesen einer Datei

open(my $infh, "<", 'infile.pica') 
     || die('Could not open pica file'); 
open(my $outfh, ">", 'infile.pica.norm') 
     || die('Could not open pica file'); 

my $counter = 0; 

while (my $line = <$infh>) { 

    $counter++; 
    # for debugging - this is the last line being read. 
    # infile actually has 7857 lines 

    if ($counter >= 7691) { 
     say $line; 
    } 
    # modification commented out for debugging 
    print $outfh $line; 
} 
close $infh; 
close $outfh; 

Mein erster Gedanke war, dass es ein seltsames Zeichen in dieser Linie ist, aber es gibt nichts

006X $cEBC$03564211 (original) 
006X $cEBC$035642 (being read, thats what the say prints) 

Hier ein Ausschnitt des Datensatzes ist, wo es aufhört zu lesen:

[email protected] $0Oax 
002C $aText$btxt 
002D $aComputermedien$bc 
002E $aOnline-Ressource$bcr 
004A $09780309160193 
006X $cEBC$03564211 
[email protected] $aeng 
[email protected] $a2010 

Sie können sehen, dass jeder Zeile ein Zeilenumbruch folgt (Hey Code 0A). In der Zeile 006X hört es auf zu lesen.

+0

Ihr Code sieht in Ordnung aus, vielleicht posten Sie weitere Details Ihrer Einrichtung? –

+0

Haben Sie sich die letzten Zeichen in den Zeilen angesehen? Per Voreinstellung teilt Perl Zeilen auf einem Zeilenumbruchzeichen ('\ n') auf - haben alle Ihre Zeilen eines? – reinierpost

+0

Sie können die Datei in etwas wie notepad ++ öffnen, lassen Sie es alle Zeichen anzeigen (wie CR, LF etc ..) und schauen Sie die verdächtige Linie, dort kann tatsächlich etwas sein, dass Sie nicht "sehen" – Nullman

Antwort

-2

Hier ist die Lösung: Das Problem hatte nichts mit dem Skript zu tun, das ich gepostet oder sogar aus Dateien gelesen habe. Im Skript habe ich nicht schreiben, vergesse ich die Ausgabe zu spülen durch den Aufruf:

PICA::Writer->end() 

Siehe PICA::Writer->end:

Fertig Schreiben. Je nach Format und Ausgabe-Handler wird eine Fußzeile geschrieben (z. B. ein XML-End-Tag) und der Ausgabe-Handler wird geschlossen. Danach wird der Status auf PICA::Writer::ENDED gesetzt. Wenn der Schreiber zuvor nicht gestartet wurde, wird die Startmethode zuerst aufgerufen.

Das Beenden oder Schreiben eines bereits beendeten Writers führt zu einem Fehler. Sie können einen beendeten Writer mit der Ausgabemethode oder mit der Startmethode neu starten.