使用 C# 程序区分具有相同内容但格式不同的两个文本文件

Differentiating between two text files having same content but in different format, using a C# program

我有两个文本文件 - 它们都包含相同的信息,但有两种不同的格式。

格式 1 有换行符,看起来格式正确。 格式 2 "appears" 是连续的,但实际上它也有换行符,但换行符以一种非常奇怪的方式表示。

https://www.dropbox.com/sh/ljlqen94a5cwza2/AAAOcuYU_EDnSLiNPRP_CDbga?dl=0

请参考附件(LineBreak.dat and NoLineBreak.dat) 在后一个文件中,有换行符但不可见 - 看起来数据上的某种转换已经改变了表示。如果您使用键盘上的右光标从第一个位置开始计数(从 i=0 开始计数),那么在 i=19 处您会发现光标卡住了一次按 - 您必须按两次才能导航到下一个位置。 这种情况发生在文档中的许多地方 - 我认为这些是现在已损坏的换行符的地方。

在我的业务案例场景中,后一种类型的文件将被视为无效。所以我需要能够编写一个 C# 程序来检测文件的类型 - 如果它是 Format1 或 Format2 并且需要帮助。

我试图通过读取 BOM 来查看它们的编码是否不同,但两个文件的编码相同。我得到以下 BOM 读数: [0]: 57 [1]: 57 [2]: 48 [3]: 54

我正在使用以下程序检测编码:

public static void GetEncoding(string pFilePath,out Encoding pFileEncoding)
{
    // Read the BOM
    var bom = new byte[4];
    using (var file = new FileStream(pFilePath, FileMode.Open, FileAccess.Read))
    {
        file.Read(bom, 0, 4);
    }

    // Analyze the BOM
    if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) pFileEncoding = Encoding.UTF7;
    if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) pFileEncoding= Encoding.UTF8;
    if (bom[0] == 0xff && bom[1] == 0xfe) pFileEncoding =Encoding.Unicode; //UTF-16LE
    if (bom[0] == 0xfe && bom[1] == 0xff) pFileEncoding= Encoding.BigEndianUnicode; //UTF-16BE
    if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) pFileEncoding= Encoding.UTF32;
    pFileEncoding= Encoding.ASCII;//or Encoding.Default
}

如果您在 "potent" 文本编辑器(如 Notepad++)中打开您的文本文件,您将能够看到文件中的每个字节,即使它是 "whitespace",即未显示在 [=26] 中=] 文本编辑器。

在您的情况下,您会发现换行符是 "Linefeed" 个字符('\n',Dec 10,十六进制 0x0A)。这是在 Unix 系统中表示 "New Line" 的常用方法。

如果您想将此类文件标记为 "invalid",只需搜索 Carriage Return('\r',dec 13 Hex 0x0D)字符和 "Linefeed" 个字符。

在 windows 个文本文件中,您会找到 0x0D/0x0A 对

仅在 Unix 文件 0x0A 中

仅在 Apple 文件 0x0D 中

(这一切与编码无关)

这两个文件具有不同样式的换行符 - 您可以在其中一个文件中使用字符串替换来使其完全相同。尝试查看 https://superuser.com/questions/545461/replace-carriage-return-and-line-feed-in-notepad 以获取手动执行此操作的方法,但您也可以在 C# 代码中执行此操作,只需将 \n 替换为 \r\n.

如果您想确保它在任何地方都能正常工作,您可以将 \n AND \r\n 替换为 Environment.NewLine

希望对您有所帮助:)

Format2 文件没有损坏;它只是在每行的末尾有 unix 风格的换行符(只是一个换行符或 \n)。另一个文件有 windows 格式的换行符(回车符 return 后跟换行符或 \r\n)。

您可以通过检查 \r 是否存在以及 none 是否存在于文件中,对整个文件执行 string.Replace("\n", "\r\n") 来轻松修复后面的文件。