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

本文关键字:数据表 数据 CSV | 更新日期: 2023-09-27 18:04:56

我使用下面的代码从csv文件导出数据表。由于值是混合文本,即数字和字母,一些列不能导出到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();
     }
 }

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

对于逗号分隔的文件

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;
}

可能有帮助的主要事情是首先停止使用OleDB对象读取分隔文件。我建议使用"TextFieldParser",这是我已经为客户成功使用了2年多的东西。

http://www.dotnetperls.com/textfieldparser

可能有其他问题,但没有看到你的。csv文件,我不能告诉你你的问题可能在哪里。

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

如果您查看我提供的链接中的示例,它们只是向控制台写入行。您可以修改此代码部分,将行添加到DataTable对象中,就像我所做的那样,以便进行排序。