2016-08-21 89 views
0

我想在這裏實現的是將文本文件的第一行讀入字符串並捕獲回車換行符(或任何其他非打印字符)完全一樣,但既沒有閱讀文件的全部內容,也沒有閱讀第二行(如果存在),在這一點上,我不知道如何使用PowerShell來實現這一點。請注意,腳本將處理大小最高爲30GB的文件,因此將所有文件內容讀入內存顯然不適用於我(按時)。閱讀文件的第一行,包括回車換行

使用下面我能夠在第一線僅但CR/LF字符獲取在該行的最後修整,以閱讀:

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

我也可以用得到的第一行:

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

但是,如預期的那樣Get-Content將每行讀取爲一個字符串並將其轉換爲對象集合,並且CR/LF字符也會在第一行中丟失。

的唯一途徑,我能夠在CR/LF字符閱讀使用與Get-Content命令行開關-Raw關鍵,但這並沒有解決我原來的問題,因爲它首先讀取文件的全部內容,並同時使用-Raw-Head不允許同時使用密鑰。

請注意,讀行的東西,如將這些字符回字符串後手動:

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

是不是我的選擇,以及我的目標純粹是爲了確定是否行我閱讀正確分隔CR/LF,CR只有或LF只有字符的組合,我不知道這一點之前,閱讀實際行。

任何有關這個主題的幫助,非常感謝。

回答

3

使用Read()方法一次,直到你遇到任何回車或換行來讀取每個字符之一:

$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

謝謝你的回答!我已經能夠成功地將這種方法適用於我的腳本。在第二個說明中,您是否以同樣的方式來看待用於讀取文件頁腳(最後一行)的類似想法? –

+0

如果在這一點上可以提供幫助,那麼我已經有了標題中的字符數,預計每行的長度都相同(僅在這裏處理固定長度的文件)。 –

0

從MSDN/StreamReader.ReadLine Method()

的線被定義爲字符,隨後是換行( 「\ n」),回車( 「\ r」),或回車的序列緊接着換行(「\ r \ n」)。返回的字符串不包含終止回車或換行符。

ReadLine()方法隱式解決您的目標/問題。它讀取數據直至達到CR,LF或CR/LF。你可能想要處理的唯一特例是當你的文件有一行(沒有EOL字符存在,只有EOF)。

+0

感謝您的回答。我在這裏看到你的觀點,但是如何確定這些角色中哪些被特別檢測到(CR,LF或CR/LF),這是我在此確定的目標? –