我正在使用OLEDB将CSV文件解析为DataTable。它工作正常,但当CSV中的某些值包含双引号(")时会产生问题。 OLEDB会跳过该行中下一个剩余列的值。
例如,我在CSV文件中有以下值。此处第二行中 Col2 的值包含双引号(")。
当我将CSV解析为DataTable时,DataTable包含以下值。此处第二行中 col3 和 col4 的值为空。
我正在使用以下连接字符串
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='text;HDR=Yes;IMEX=1;ColNameHeader=True;CharacterSet=65001;FMT=Delimited(,)'"
查询是
"select * from [" + fileName + "]"
这是完整的代码
string connStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='text;HDR=Yes;IMEX=1;ColNameHeader=True;CharacterSet=65001;FMT=Delimited(,)'";
using (OleDbConnection conn = new OleDbConnection(connStr))
{
conn.Open();
table = new DataTable();
var dataAdapter = new OleDbDataAdapter("select * from [" + fileName + "]", conn);
dataAdapter.Fill(table);
}
如何从值中忽略双引号(")?
注意:我正在从第三方下载该文件,直接使用该CSV进行解析。
答案 0 :(得分:0)
您将需要创建schema.ini文件并将其放在与您从中提取数据的文件所在的目录中。在其中,您必须将TextDelimiter
和Format
提供给csv文件。将TextDelimiter
设置为none
[YOURCSVFILENAME.csv]
ColNameHeader=True
Format=CSVDelimited
TextDelimiter=none
希望这有帮助。
<强>更新强> 动态创建schema.ini文件...
string csvFilePath = /* CSV file directory */
string csvFileName = /* CSV file name */
using (FileStream sr = new FileStream(csvFilePath + "\\schema.ini",
FileMode.Create, FileAccess.Write))
{
using (StreamWriter writer=new StreamWriter(sr))
{
writer.WriteLine("[" + csvFileName + "]");
writer.WriteLine("ColNameHeader=True");
writer.WriteLine("Format=CSVDelimited");
writer.WriteLine("TextDelimiter=none");
writer.Close();
writer.Dispose();
}
}