无法使用OLEDB读取CSV文件中的所有列

4
我有一个csv文件,头部如下: "取货日期","取货时间","取货地址","来自区域",以此类推... 我只能使用oledb读取前两列,无法读取更多。我使用了一个包含所有列名的schema.ini文件。 请给出建议。

这是我的样本csv。

"PickupDate","PickupTime","PickupAddress","FromZone"
"11/05/15","4:00:00 AM","9 Houston Rd, CityName, NC 28262,","262"

这是我的代码:

Schema.ini
-----------
[ReportResults.csv]
ColNameHeader = True
Format = CSVDelimited
col1=Pickup Date DateTime
col2=Pickup Time Text width 100
col3=Pickup Address Text width 500
col4=FromZone short

oledb code
-----------      

     public static DataTable SelectCSV(string path, string query)
     {
      // since the file contains addresses with , the delimiter ", is used. Each cell is written within "" in  the file.
                  var strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path +
                                "; Extended Properties='text;HDR=Yes;FMT=Delimited(\",)'";

                  OleDbConnection selectConnection = (OleDbConnection)null;
                  OleDbDataAdapter oleDbDataAdapter = (OleDbDataAdapter)null;


                      selectConnection = new OleDbConnection(strConn);
                      selectConnection.Open();
                      using(OleDbCommand cmd=new OleDbCommand(query,selectConnection))
                      using (oleDbDataAdapter = new OleDbDataAdapter(cmd))
                      {
                          DataTable dt = new DataTable();
                          dt.Locale=CultureInfo.CurrentCulture;
                          oleDbDataAdapter.Fill(dt);
                          return dt;
                      }
    }
1个回答

1
每一列都包含在双引号中,因此双引号内的逗号不被视为分隔符。
所以你可以导入文件:
- 不使用 schema.ini - 在连接字符串中指定 EXTENDED PROPERTIES='text;HDR=Yes;FMT=Delimited'
如果需要使用架构解决其他问题,请注意您的 schema.ini 不是正式正确的;请使用类似以下的内容:
[ReportResults.csv]
ColNameHeader = True
Format = CSVDelimited
col1=PickupDate DateTime
col2=PickupTime Text width 100
col3=PickupAddress Text width 500
col4=FromZone short

如果您在提取DateTime列时遇到问题,请指定DateTimeFormat选项;例如,如果您的接送日期类似于2015/11/13,请指定DateTimeFormat=yyyy/MM/dd=yyyy/MM/dd

如果您在提取Short列时遇到问题,请验证FromZone是否为介于-32768和32767之间的整数;如果不是,请使用其他类型。如果您遇到小数分隔符的问题,还可以设置DecimalSymbol选项。

您可以在MSDN上找到更多信息。


谢谢您的回复。我也尝试了建议的schema.ini格式,但没有帮助。地址是文本,它也无法读取。 - Learner
你能否发布一份你的 CSV 文件的摘录? - tezzo
当然。我已经从csv文件中添加了一行示例。 - Learner
我已经尝试过在列名中加入空格(Pickup Date),也尝试过去掉空格(PickupDate)。 - Learner
是的,但每个列都包含在双引号中,因此双引号内的每个逗号不被视为分隔符。 - tezzo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接