2016-08-21 4 views
0

Was ich hier erreichen möchte, ist das Lesen der ersten Zeile einer Textdatei in die Zeichenfolge und erfassen Wagenrücklauf Zeilenvorschub (oder andere nicht druckbare Zeichen) auch nicht, ohne den vollen Inhalt der Datei oder die zweite Zeile (falls vorhanden) zu lesen, und an dieser Stelle bin ich nicht sicher, wie dies mit PowerShell erreicht werden kann. Bitte beachten Sie, dass sich das Skript mit Dateien mit einer Größe von bis zu 30 GB befassen wird, sodass das Lesen aller Dateiinhalte in den Speicher für mich (auch zeitweise) keine Option ist.Lesen Sie die erste Zeile der Datei einschließlich Wagenrücklauf Zeilenvorschub

der unter Verwendung ich in der Lage bin nur in der ersten Zeile zu lesen, aber CR/LF Zeichen am Ende der Linie getrimmt erhalten:

$File = New-Object System.IO.StreamReader -Arg $PathFull 
    $Header = $File.ReadLine() 
    $File.Close() 

ich auch die erste Zeile mit bekommen kann:

$Header = (Get-Content -Path $PathFull -Head 1) 

aber wie erwartet Get-Content liest jede Zeile als String in Sammlung von Objekten und CR/LF Zeichen hier auch in der ersten Zeile auch verloren gehen.

Der einzige Weg, ich war in der Lage in den CR/LF Zeichen zu lesen, wurde mit den -Raw Schlüsseln mit Get-Content Commandlet, aber das hat nicht mein ursprüngliches Problem zu lösen, da es den gesamten Inhalt der Datei zuerst gelesen und sowohl -Raw und -Head mit Schlüssel zur gleichen Zeit ist nicht erlaubt.

Bitte beachten Sie, dass diese Zeichen wieder auf den String manuell hinzufügen, nachdem die Zeile mit etwas zu lesen wie:

$Header = $Header + "$([Char]13)$([Char]10)" 

ist keine Option für mich als auch mein Ziel rein ist, ob die Linie zu bestimmen I Lesen wurde korrekt mit einer Kombination von CR/LF, CR nur oder LF nur Zeichen und ich habe keine Kenntnis davon vor dem Lesen der tatsächlichen Zeile.

Jede Hilfe zu diesem Thema wird sehr geschätzt.

Antwort

3

Verwenden Sie die Read() Methode jedes Zeichen einer nach dem anderen zu lesen, bis Sie entweder einen Wagenrücklauf oder ein Zeilenvorschub auftreten:

$reader = New-Object System.IO.StreamReader D:\file.txt  
do{ 
    $c = $reader.Read() 
    $result = if($c -eq 13){ 
     if(-not $reader.EndOfStream -and 10 -eq $reader.Read()){ 
      'CRLF' 
     }else{ 
      'CR' 
     } 
    }elseif($c -eq 10){ 
     'LF' 
    } 
}until($result) 
$reader.Dispose() 

return $result 
+0

Vielen Dank für eine Antwort! Ich konnte diesen Ansatz erfolgreich an mein Skript anpassen. Denken Sie an eine ähnliche Idee zum Lesen der Fußzeile (letzte Zeile) auf die gleiche Weise? –

+0

Wenn es zu diesem Zeitpunkt helfen kann, habe ich bereits die Anzahl der Zeichen in der Kopfzeile, die voraussichtlich für jede Zeile die gleiche Länge sein wird (hier nur mit Dateien mit fester Länge). –

0

von MSDN/StreamReader.ReadLine Method():

Eine Linie als eine Folge von Zeichen, die durch einen Zeilenvorschub ("\ n"), einen Wagenrücklauf ("\ r") oder einem Wagenrücklauf folgt definiert ist unmittelbar gefolgt von einem Zeilenvorschub ("\ r \ n"). Die Zeichenfolge, die zurückgegeben wird, enthält den abschließenden Wagenrücklauf oder den Zeilenvorschub nicht.

Die ReadLine() - Methode löst implizit Ihr Ziel/Problem. Es liest Daten, bis es CR, LF oder CR/LF erreicht. Der einzige spezielle Fall, den Sie vielleicht behandeln möchten, ist, wenn Ihre Datei eine einzige Zeile hat (keine EOL-Zeichen vorhanden, nur EOF).

+0

Danke für die Antwort. Ich sehe deinen Punkt hier, aber wie ermittle ich dann, welcher dieser Charaktere speziell erkannt wurde (CR, LF oder CR/LF), wie soll das hier mein Ziel sein? –

Verwandte Themen