如何从UTF 8编码的csv中删除BOM()字符?

时间:2011-06-07 05:23:09

标签: c# parsing csv utf-8

我需要解析一个utf8编码的csv。在转换之后,我刚刚看到问题在于beging的BOM()字符。我无法使用utf8编码创建一个避免BOM的csv,因为我需要解析它,即使它是utf8编码的。

任何人请告诉我如何使用c#.net从csv中删除BOM()字符。

更新:我已经添加了我的代码来读取csv标题,因为我在文件的开头获取了BOM。

 string CSVConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationSettings.AppSettings["CSVFolder"].ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

        using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
        {
            List<string> CSVHeaders = new List<string>();

            string SelectQuery = string.Format(@"SELECT TOP 1 * FROM [{0}]", CSVFileName);

            OdbcCommand Command = new OdbcCommand(SelectQuery, Connection);

            Connection.Open();

            OdbcDataReader Reader = Command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

            int ColumnCount = Reader.FieldCount;

            for (int column = 0; column < ColumnCount; column++)
            {
                CSVHeaders.Add(Reader.GetName(column));
            }

            return CSVHeaders;
        }

3 个答案:

答案 0 :(得分:4)

实际上,C#可以读取包含BOM的UTF-8编码文件。这是你正在使用的破坏的CSV文本驱动程序实际上导致了问题。我推荐this answer中的其他CSV阅读解决方案之一。

答案 1 :(得分:2)

这是一个执行此操作的函数:

    public static void SaveAsUTF8WithoutByteOrderMark(string fileName)
    {
        SaveAsUTF8WithoutByteOrderMark(fileName, null);
    }

    public static void SaveAsUTF8WithoutByteOrderMark(string fileName, Encoding encoding)
    {
        if (fileName == null)
            throw new ArgumentNullException("fileName");

        if (encoding == null)
        {
            encoding = Encoding.Default;
        }

        File.WriteAllText(fileName, File.ReadAllText(fileName, encoding), new UTF8Encoding(false));
    }

答案 2 :(得分:1)

不要改变马匹(使用另一个.csv驱动程序)或通过自己拉动马车来帮助给定的马(更改编码),你应该告诉马(标准的ODBC文本驱动程序)它需要知道做什么通过添加schema.ini文件来完成作业:

[withbomgood.txt]
Format=TabDelimited
ColNameHeader=True
CharacterSet=65001
Col1=FrsColümn CHAR

定义withbomgood.txt的格式:

FrsColümn
whätever

这是withbombad.txt的精确副本;这两个文件都有BOM:

FrsColümn
whätever

如果您现在调用稍微修改过的副本

static void Harun00(string CSVFileName)
{
    string CSVFilePath = @"E:\trials\SoTrials\answers\6260911\data";
    string CSVConnectionString = 
        "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + 
        CSVFilePath +
        ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

    using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
    {
        List<string> CSVHeaders = new List<string>();

        string SelectQuery = string.Format(@"SELECT TOP 1 * FROM [{0}]", CSVFileName);

        OdbcCommand Command = new OdbcCommand(SelectQuery, Connection);

        Connection.Open();

        OdbcDataReader Reader = Command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);

        int ColumnCount = Reader.FieldCount;

        for (int column = 0; column < ColumnCount; column++)
        {
            CSVHeaders.Add(Reader.GetName(column));
        }

        Console.WriteLine(CSVHeaders[0]);
    }
}
你的代码

两次:

static void Main(string[] args)
{
    Harun00("withbombad.txt");
    Harun00("withbomgood.txt");
}

你得到:

FrsColümn
FrsColümn
Press any key to continue . . .

证明驱动程序将正确读取带有BOM文件的UTF8,如果您遵循该规则,则无需任何进一步的ADO:在schema.ini文件中定义您的csv表。