使用OLEDB无法从CSV获取所有列的值

时间:2018-01-12 14:17:47

标签: c# csv oledb .net-4.5

我正在使用OLEDB将CSV文件解析为DataTable。它工作正常,但当CSV中的某些值包含双引号(")时会产生问题。 OLEDB会跳过该行中下一个剩余列的值。

例如,我在CSV文件中有以下值。此处第二行中 Col2 的值包含双引号(")。

enter image description here

当我将CSV解析为DataTable时,DataTable包含以下值。此处第二行中 col3 col4 的值为空。

enter image description here

我正在使用以下连接字符串

"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进行解析。

1 个答案:

答案 0 :(得分:0)

您将需要创建schema.ini文件并将其放在与您从中提取数据的文件所在的目录中。在其中,您必须将TextDelimiterFormat提供给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(); 
      } 
  }