C# 确定文本文件中使用的行尾

C# 确定文本文件中使用的行尾,c#,text-files,cross-platform,newline,C#,Text Files,Cross Platform,Newline,在C#中,确定文本文件(Unix、Windows、Mac)中使用的行尾的最佳方法是什么?有环境。NewLine,尽管它仅用于确定当前系统上使用的内容,对从各种来源读取文件没有帮助 如果它正在阅读,我通常会查找\n(编辑:显然有一些只使用\r)并假设行结束于此。我想你可能无法确定,必须在编辑器中设置它。你可以使用一些人工智能,算法是: 搜索每种类型的行尾,您都会搜索那些特定的字符 测量它们之间的距离 如果有一种类型倾向于重复,那么你假设这就是类型。计算重复次数并使用一些分散度度量 例如,如果您在3

在C#中,确定文本文件(Unix、Windows、Mac)中使用的行尾的最佳方法是什么?

环境。NewLine
,尽管它仅用于确定当前系统上使用的内容,对从各种来源读取文件没有帮助


如果它正在阅读,我通常会查找
\n
(编辑:显然有一些只使用
\r
)并假设行结束于此。

我想你可能无法确定,必须在编辑器中设置它。你可以使用一些人工智能,算法是:

  • 搜索每种类型的行尾,您都会搜索那些特定的字符
  • 测量它们之间的距离
  • 如果有一种类型倾向于重复,那么你假设这就是类型。计算重复次数并使用一些分散度度量

  • 例如,如果您在38、40、45处重复了CRLF,并且在公差范围内,那么默认情况下,您将假定线端为CRLF

    如果是我,我只会一次读一个字符,直到遇到第一个
    \r
    \n
    。这是假设您有感官输入。

    我只需搜索文件中的第一个
    \r
    \n
    ,如果它是
    \n
    ,我会查看前面的字符,看看它是否是
    \r
    ,如果是,它是
    \r\n
    ,否则它是找到的任何一个。

    阅读我通常寻找的大多数文本格式\n,然后修剪整个字符串(开头和结尾的空格通常是多余的)。

    这里有一些高级猜测:读取文件,计算CRs和LFs

    if (CR > LF*2) then "Mac" 
    else if (LF > CR*2) then "Unix"
    else "Windows"
    

    还请注意,较新的Mac(Mac OS X)使用Unix行结尾

    请注意,文本文件的行结尾可能不一致。你的程序不应该因此而窒息。在
    StreamReader
    上使用
    ReadLine
    (以及类似方法)将自动处理任何可能的行尾

    如果手动读取文件中的行,请确保接受任何行结尾,即使不一致。实际上,使用以下算法非常容易:

    • 向前扫描,直到找到CR或LF
    • 如果你读CR,向前看下一个字符
    • 如果下一个字符是LF,则使用它(否则,将其放回)

    嗯,我会把你的段落换一换——第二段是答案——不确定<代码>环境。新行是非常相关的。据我所知,没有提到这是用于阅读各种来源还是写入问题中的多个目标,当时的标签只是C。例如,如果问题涉及在其他平台(mono等)上“正确”编写,我认为
    Environment.NewLine
    很有用。不管怎样,我没有花太多时间考虑段落的排序。要知道,对于Unicode文件,有许多不同的字符被认为是合法的行终止符。它们包括:回车符(U+000D)、换行符(U+000A)、回车符(U+000D)后跟换行符(U+000A)、换行符(U+2028)和段落分隔符(U+2029)。有时还有一个“文本结尾”(U+0003)字符,可以合法地用作文件最后一行的终止符。许多文件甚至混合了几种类型(HL7,我在看你)。如果你“在文件中搜索第一个
    \r
    \n
    ”,那么你就知道前面的字符不是这两个字符。我想你的意思是看下一个字符(看看这对字符是否是
    \r\n
    )。