【问题标题】:Parsing what is supposed to be a tab-delimited file in C# [duplicate]在 C# 中解析应该是制表符分隔的文件 [重复]
【发布时间】:2016-08-05 16:43:05
【问题描述】:

B"H

我有一个应该用制表符分隔的文件。 Excel打开它没有问题。但是当我尝试 File.ReadAllText() 时,我无法得到一个像样的表示。 我能做的最好的就是使用 UTF8 来返回大部分数据,但是第一行全乱了,文档其余部分的一些选项卡丢失了。

这是使用 UTF8 读取时的第一行: �\u0010\b\u0004c\u0004\0\0�\u0006�\u0003\0\0\0\0!�A\u0004\0\0\0\0\0\0\0\0\u0001 \0\0\0ID\0\0\0\0\0\0C\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\0C\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\0C\0\0\0\0(\0\0\0\0\0\0\0\ 0\0\0\0\0\0\0\0ADDRC\0\0\0\0\0\0C\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\0C\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\0C\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\u0001\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\r

以下是在记事本中打开时显示的前几个字节: õc ÁŸ !£A

有人认识这种编码吗?

【问题讨论】:

  • 你试过StreamReader.CurrentEncoding吗?
  • StreamReader.CurrentEncoding 仅适用于标准编码。这些文件显然不是标准的。
  • @peter-duniho 这个问题不是重复的。它甚至与您发布的问题无关。该问题询问您如何以编程方式从标准编码的小列表中找到编码。我不需要程序检测。我需要帮助识别这个特定的编码。
  • "我不需要编程检测"——那么你的问题甚至不是编程问题,也不属于 Stack Overflow。改用 superuser.stackexchange.com。或者以编程方式找出编码,每个标记的重复项(你为什么关心如何你找到编码,只要你找到它?)
  • @PeterDuniho 嗨。此问题现已编辑,因此不再给人以重复 How can I detect the encoding/codepage of a text file 的印象。您现在可以删除重复标记吗?

标签: c# utf-8 character-encoding csv


【解决方案1】:

首先,让我们检查是否存在与编码相关的问题,这是纯文本文件的祸根。使用 Microsoft Word 或 Notepad++ 通过预览每个编码来发现编码。

在 Microsoft Word 中,转到菜单、“选项”、“高级”、“常规”小节并勾选“打开时确认文件格式转换”。完成后,单击“确定”按钮。然后,在 Microsoft Word 中打开该文件。预览每个编码,直到找到一个正确显示所有内容的编码。

找到编码后,使用 .NET Framework to open the file with that encoding 的 StreamReader 类。

【讨论】:

  • 谢谢。 Word 和 NotePad++ 是很棒的创意。他们都无法正确打开文件。每一个都提供了许多编码选项来尝试,但没有一个能正确显示文件。现在 Excel 确实可以正常显示文件。问题是我有一堆这样的文件,所以我需要弄清楚它是什么编码,这样我才能从语法上读取这些文件。而且我在 Excel 中找不到可以告诉我它使用什么编码打开文件的地方。
  • @Rabbi:这当然很奇怪。您所拥有的实际上可能是 excel 可识别的二进制文件,而根本不是纯文本文件。您可以尝试将它们从 Excel 导出到实际的制表符分隔文件中。此外,我可以为您分析其中一个文件,但出于隐私原因,您可能不想这样做。
【解决方案2】:

到目前为止,这种获取文件编码的方式对我来说很好。

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
}

【讨论】:

  • 谢谢。正如我在问题中所说。这些文件不是任何标准编码。我已经尝试了所有的常客,但我没有得到可用的文件。另一方面,Excel 可以很好地打开它们。我只需要知道如何在语法上做到这一点。一旦我确定了这种编码,我就不需要在语法上检查它——我只需要编写(或找到)一个转换函数。
  • 你的问题标题是“你怎么能找到文件c#的编码”
  • 是的,我需要一种方法来找到这个特定文件的编码。这不是标准编码。请阅读问题的正文。
  • vEdit 和 EditPlus 是我们用来“检测”编码的 2 个文本编辑器。但这不是 c#。
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 2015-02-14
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多