解析什么是应该在C#
B“H制表符分隔的文件解析什么是应该在C#
我应该是制表符分隔的文件。Excel打开它精细没有问题。但是当我尝试File.ReadAllText( )我无法得到一个体面的代表 我可以做的最好的是UTF8返回大部分数据,但是第一行全部搞砸了,文档其余部分的一些标签丢失了。这是使用UTF8读取的第一行: ? 0 \ 0 \ 0 \ 0 \ 0 \ U0001 \ 0 \ 0 \ 0ID \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0 \ u0006 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0NAME \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0 \ u001e \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0ADDR \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0(\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0ADDRC \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0(\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0CITY \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0 \ u001e \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0STATE \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ 0 \ 0 \ 0 \ u0014 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0ZIP \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0L \ 0 \ 0 \ 0 \ 0 \ 00001 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \在记事本中打开时显示的几个字节: !!A A
有没有人认识到编码?
首先,我们来检查一下编码相关问题的可能性,它是纯文本文件的*。使用Microsoft Word或Notepad ++通过预览每一个来发现编码。
在Microsoft Word中,进入菜单“选项”,“高级”,“常规”小节,并在“打开时确认文件格式转换”之外进行检查。完成后,点击确定按钮。然后,在Microsoft Word中打开该文件。预览每个编码,直到找到能正确显示所有内容的编码。
一旦找到编码,请使用.NET Framework to open the file with that encoding的StreamReader
类。
谢谢。 Word和NotePad ++是伟大的想法。他们都不能正确打开文件。每个人都提供了大量的编码选项,但没有一个能够正确显示文件。现在,Excel不会显示该文件。问题是我有一堆这样的文件,所以我需要弄清楚它是什么编码,以便我可以在语法上读取这些文件。我无法在Excel中找到一个能够告诉我使用什么编码打开文件的地方。 – Rabbi
@Rabbi:这当然很奇怪。有可能你拥有的实际上是一个excel可识别的二进制文件,根本不是纯文本文件。您可以尝试将它们从Excel导出到实际的制表符分隔文件中。另外,我可以为你分析其中的一个文件,但是,出于隐私原因你可能不想这样做。 –
到目前为止,这种获取文件编码的方式对我来说很好。
http://weblog.west-wind.com/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader
/// <summary>
/// Detects the byte order mark of a file and returns
/// http://weblog.west-wind.com/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader
/// an appropriate encoding for the file.
/// </summary>
/// <param name="srcFile"></param>
/// <returns></returns>
public static Encoding GetFileEncoding(string srcFile)
{
// *** Use Default of Encoding.Default (Ansi CodePage)
Encoding enc = Encoding.Default;
// *** Detect byte order mark if any - otherwise assume default
byte[] buffer = new byte[5];
FileStream file = new FileStream(srcFile, FileMode.Open);
file.Read(buffer, 0, 5);
file.Close();
if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
enc = Encoding.UTF8;
else if (buffer[0] == 0xfe && buffer[1] == 0xff)
enc = Encoding.Unicode;
else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
enc = Encoding.UTF32;
else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
enc = Encoding.UTF7;
return enc;
}
我使用这样的
//To read
Encoding currentFileEnc = GetFileEncoding(TheFile);
using (StreamReader sr = new StreamReader(TheFile, currentFileEnc))
{
//Blah blah blah
}
//To write back
using (StreamWriter sw = new StreamWriter(TempFilePath, false, currentFileEnc))
{
//blah blah blah
}
你试过'StreamReader.CurrentEncoding'? – Rahul
StreamReader.CurrentEncoding仅适用于标准编码。这些文件显然不是标准的。 – Rabbi
@ peter-duniho此问题不重复。它甚至与你发布的问题没有关系。该问题询问您将如何通过编程从标准编码的小列表中找到编码。我不需要程序检测。我需要帮助确定这种特定的编码。 – Rabbi