将csv加载到oleDB中并强制所有推断的数据类型为字符串

我试图使用oledb将csv文件加载到数据表中。

这没有问题,但不幸的是,其中一个看起来是数字的字段在字段中有大约3%的字符串值,因此没有填充。

因为我将csv转换为xml我真的不关心推断数据类型,只需要字符串中的数据,因为我可以稍后在Linq2XMl阶段投出它。

我希望能够在连接字符串中执行此操作。

我不想只是复制表,使用我想要的数据类型的新列进行设置,然后将数据写入其中,因为这将涉及加载csv文件两次。

有任何想法吗?

我当前的连接字符串是

Provider = Microsoft.Jet.OLEDB.4.0; Data Source =“+ thefile.DirectoryName +”; Extended Properties =’text; HDR = Yes; FMT = Delimited’“;

有人研究答案是使用schema.ini但是为您的数据集动态生成它。

http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx

包含所需的信息。 构建架构:

public static void ConstructSchema(FileInfo theFile) { StringBuilder schema = new StringBuilder(); DataTable data = LoadCSV(theFile); schema.AppendLine("[" + theFile.Name + "]"); schema.AppendLine("ColNameHeader=True"); for (int i = 0; i < data.Columns.Count; i++) { schema.AppendLine("col" + (i + 1).ToString() + "=" + data.Columns[i].ColumnName + " Text"); } string schemaFileName = theFile.DirectoryName + @"\Schema.ini"; TextWriter tw = new StreamWriter(schemaFileName); tw.WriteLine(schema.ToString()); tw.Close(); } 

将csv加载为数据表

 public static DataTable LoadCSV(FileInfo theFile) { string sqlString = "Select * FROM [" + theFile.Name + "];"; string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + theFile.DirectoryName + ";" + "Extended Properties='text;HDR=YES;'"; DataTable theCSV = new DataTable(); using (OleDbConnection conn = new OleDbConnection(conStr)) { using (OleDbCommand comm = new OleDbCommand(sqlString, conn)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(comm)) { adapter.Fill(theCSV); } } } return theCSV; } 

转换为xml

  public static XElement GetXMLFromCSV(FileInfo theFile, string rootNodeName, string itemName) { XElement retVal; DataTable data; data = CrateCsvAndSchema(theFile); DataSet ds = new DataSet(rootNodeName); data.TableName = itemName; ds.Tables.Add(data); retVal = XElement.Parse(ds.GetXml()); return retVal; } 

要将CSV读入DataTable,我建议使用此CSV解析器 。

它真的很容易使用。 以下是如何使用逗号分隔,引用合格的CSV来使用它来填充DataTable的数据:

  DataTable dt = null; using (GenericParserAdapter gp = new GenericParser.GenericParserAdapter(yourCsvFullname)) { dt = gp.GetDataTable(); } 

您可以设置许多选项:分隔符,文本限定符字符是否CSV中的第一行显示列标题(如果为true,则DataTable中的每个DataColumn都将相应地命名),等等。

有许多快速,灵活的CSV解析器,但是对于简单的要求,这个解析不可能。