【问题标题】:Read the first line of the file including carriage return line feed读取文件的第一行,包括回车换行
【发布时间】:2016-08-22 04:13:57
【问题描述】:

我在这里尝试实现的是将文本文件的第一行读取到字符串并完全捕获回车换行符(或任何其他不可打印的字符),但在没有读取完整内容的情况下都不会文件也不是第二行(如果存在),此时我不确定如何使用 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/LFCRLF 的组合分隔,我不知道在阅读实际行之前。

非常感谢有关此主题的任何帮助。

【问题讨论】:

    标签: powershell carriage-return


    【解决方案1】:

    使用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
    

    【讨论】:

    • 感谢您的回答!我已经能够成功地将这种方法应用于我的脚本。其次,您是否认为以相同方式读取文件页脚(最后一行)的任何类似想法?
    • 如果此时可以提供帮助,我已经知道标题中的字符数,预计每行的长度相同(此处仅处理固定长度的文件)。跨度>
    【解决方案2】:

    来自 MSDN /StreamReader.ReadLine Method ():

    行定义为一系列字符后跟换行符 ("\n")、回车符 ("\r") 或回车符后紧跟换行符 ("\r\n ”)。返回的字符串不包含终止回车或换行。

    ReadLine() 方法隐式地解决了您的目标/问题。它读取数据直到达到 CR、LF 或 CR/LF。您可能要处理的唯一特殊情况是您的文件只有一行(不存在 EOL 字符,只有 EOF)。

    【讨论】:

    • 感谢您的回答。我在这里明白你的意思,但是我如何确定这些字符中的哪些已被具体检测到(CR、LF 或 CR/LF),因为这是我在这里确定的目标?
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2015-09-05
    • 2018-08-03
    • 1970-01-01
    • 2010-12-26
    • 2021-04-02
    相关资源
    最近更新 更多