我需要解析一个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;
}
答案 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表。