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

Joh*_*las 5 c# csv oledb connection-string

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

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

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

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

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

有任何想法吗?

我当前的连接字符串是

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

Joh*_*las 6

有些人研究答案是使用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();  
    }
Run Code Online (Sandbox Code Playgroud)

将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;
    }
Run Code Online (Sandbox Code Playgroud)

转换为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;
    }
Run Code Online (Sandbox Code Playgroud)