将数据从CSV导出到c#中的数据表

时间:2015-07-28 05:52:12

标签: c# csv datatable

我使用下面的代码将数据从csv文件导出到datatable。 由于值是混合文本,即数字和字母,因此某些列不会导出到Datatable。

我在这里做了一些研究,发现我们需要在注册表中设置ImportMixedType = TextTypeGuessRows = 0,甚至没有解决问题。 下面的代码适用于某些文件,即使是混合文本。

有人能告诉我下面的代码有什么问题。我在这里想念一些事吗。

if (isFirstRowHeader)
            {
                header = "Yes";
            }

            using (OleDbConnection connection = new OleDbConnection(
                    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
                    ";Extended Properties=\"text;HDR=" + header + ";FMT=Delimited\";"))
            {
                using (OleDbCommand command = new OleDbCommand(sql, connection))
                {                       
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {                           

                        adapter.Fill(table);
                    }
                    connection.Close();
                }
            }

2 个答案:

答案 0 :(得分:0)

可能有用的主要是首先停止使用OleDB对象来读取分隔文件。我建议使用'TextFieldParser',这是我已经成功使用了2年以上的客户端。

http://www.dotnetperls.com/textfieldparser

可能还有其他问题,但没有看到您的.CSV文件,我无法告诉您问题所在。

TextFieldParser专门用于解析逗号分隔文件。 OleDb对象不是。所以,从那里开始然后我们可以确定问题可能是什么,如果它仍然存在。

如果您查看我提供的链接上的示例,它们只是在控制台上写行。您可以更改此代码部分,以便像我一样将行添加到DataTable对象,以进行排序。

答案 1 :(得分:0)

对于逗号分隔的文件,这对我有用

public DataTable CSVtoDataTable(string inputpath)
   {

    DataTable csvdt = new DataTable();
    string Fulltext;
    if (File.Exists(inputpath))
    {
       using (StreamReader sr = new StreamReader(inputpath))
        {
            while (!sr.EndOfStream)
            {
                Fulltext = sr.ReadToEnd().ToString();//read full content
                string[] rows = Fulltext.Split('\n');//split file content to get the rows
                for (int i = 0; i < rows.Count() - 1; i++)
                {
                    var regex = new Regex("\\\"(.*?)\\\"");
                    var output = regex.Replace(rows[i], m => m.Value.Replace(",", "\\c"));//replace commas inside quotes
                    string[] rowValues = output.Split(',');//split rows with comma',' to get the column values
                    {
                        if (i == 0)
                        {
                            for (int j = 0; j < rowValues.Count(); j++)
                            {
                                csvdt.Columns.Add(rowValues[j].Replace("\\c",","));//headers
                            }

                        }
                        else
                        {
                            try
                            {
                                DataRow dr = csvdt.NewRow();
                                for (int k = 0; k < rowValues.Count(); k++)
                                {
                                    if (k >= dr.Table.Columns.Count)// more columns may exist
                                    { csvdt .Columns.Add("clmn" + k);
                                        dr = csvdt .NewRow();
                                    }
                                    dr[k] = rowValues[k].Replace("\\c", ",");

                                }
                                csvdt.Rows.Add(dr);//add other rows
                            }
                            catch
                            {
                                Console.WriteLine("error");
                            }
                        }
                    }
                }
            }
        }
    }
    return csvdt;
}