使用 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")
来轻松修复后面的文件。
我有两个文本文件 - 它们都包含相同的信息,但有两种不同的格式。
格式 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")
来轻松修复后面的文件。