2016-08-21 96 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),这是我在此确定的目标? –