我正在尝试使用以下代码读取csv文件。该文件也有列标题。
以下是在数据集中加载文件后的输出。
public DataSet LoadCVS(string filePath)
{
DataSet ds = new DataSet();
string fileName = System.IO.Path.GetFileName(filePath);
try
{
string path = @System.IO.Path.GetDirectoryName(filePath);
using (OleDbConnection conn =
new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + @";Extended Properties=""Text;HDR=Yes;FMT=Delimited"""))
{
using (OleDbCommand cmd =
new OleDbCommand("SELECT * FROM [" + fileName + "]", conn))
{
conn.Open();
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(ds, "csv");
}
}
}
catch (Exception ex) //Error
{
MessageBox.Show(ex.Message);
}
return ds;
}
csv文件的示例数据:
Org,Item Number,Item Description,Lot Number,Lot Expiration Date,Marketing Division,Product Type
F01,Jan-00,LFIT MORSE TAPER HEAD,MHD7D8,3-May-14,5,5
F01,Jan-05,LFIT MORSE TAPER HEAD,MHATY9,1-Mar-14,5,5
F01,Jan-00,LFIT MORSE TAPER HEAD,MHDEN1,8-Mar-14,5,5
F01,Jan-05,LFIT MORSE TAPER HEAD,MHNY4L,18-Nov-14,5,5
F01,Jan-10,LFIT MORSE TAPER HEAD,MHHLYR,31-May-14,5,5
F01,Jan-00,LFIT MORSE TAPER HEAD,MJNKRK,10-Oct-15,5,5
F01,Jan-00,LFIT MORSE TAPER HEAD,MKNN38,14-Nov-16,5,5
F01,Jan-05,LFIT MORSE TAPER HEAD,MJDV6X,8-Apr-15,5,5
F01,Jan-05,LFIT MORSE TAPER HEAD,MKAK94,22-Feb-16,5,5
问题:
答案 0 :(得分:5)
您所看到的是OLEDB驱动程序试图帮助您并推断列的数据类型。在您的情况下,它会在第一列中看到所有'F01',并且您希望该列中的数字用于保存数字数据。
您可以通过在与CSV相同的文件夹中创建名为schema.ini的文本文件来指定CSV列的数据类型。在此文件中,您将为数据文件中的每一列指定列的名称和列的数据类型。以下是您的数据示例:
[NameOfYourCSVDataFile.csv]
Col1=Org Text
Col2="Item Number" Text
Col3="Item Description" Text
Col4="Lot Number" Text
Col5="Lot Expiration Date" Text
Col6="Marketing Division" Text
Col7="Product Type" Text
您可以在schema.ini文件中定义其他属性。有关详细信息,请参阅this。
如果您不想或不想手动创建schema.ini,则可以在尝试读取CSV之前以编程方式创建文件。
我强烈建议您不要使用OLEDB来读取CSV,如果你可以完全避免它。有很多功能强大的CSV阅读器,如果您在问题中提供的样本数据完全像您的真实数据,那么我敢打赌您会发现这些数据比OLEDB更容易使用。你的问题带回了一些痛苦的回忆。