如何将数据从CSV文件批量复制到SQL?

时间:2017-08-19 12:57:38

标签: c# sql datatable import-from-csv

我试过这样:

    public Datatable GetDatatable(){
        string[] csv=@"1,ABC,Arun,12/12/2017\n
        2,BCD,Sam,10/12/2017\n
        3,XYZ,Ammy,11/12/2017\n
        4,PQR,Varun,9/12/2017\n";
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        foreach (var line in csv)
         {
              string[] l=line.split(',');
              table.Rows.Add(l[0]);
              table.Rows.Add(l[1]);
              table.Rows.Add(l[2]);
              table.Rows.Add(l[3]);
         }
         return table;
    }

csv喜欢

1,ABC,Arun,12/12/2017
2,BCD,Sam,10/12/2017
3,XYZ,Ammy,11/12/2017
4,PQR,Varun,9/12/2017

使用foreach完成。我想要相同的结果而不使用for循环 或foreach,因为CSV包含超过300万行。请提出一些想法或建议。

4 个答案:

答案 0 :(得分:1)

您可以使用OLEDB使用SQL(有点)查询读取CSV文件:

请查看此答案以获取示例:Most efficient way to process a large csv in .NET

您还可以使用现有的库,例如FileHelpers:http://www.filehelpers.net/,它可以轻松快速地解析大型CSV文件。

答案 1 :(得分:1)

在某种方式中,将始终执行循环以读取文件,拆分该行并将其插入DataTable中。
有许多免费的库可以使用CSV文件,如果你执行一个简单的搜索,你会很容易找到它们。

但是你的代码可以改进(和修复),只需将该行拆分一次,而不是在该循环中拆分4次,并添加只有一行的行 (实际上你的代码为每一行添加了4行,这看起来非常错误)

foreach (var line in csv)
{
    string[] parts = line.Split(',');
    table.Rows.Add(parts);
}
return table;

如果这足以满足您的要求,则由您来评估。有这么多行要阅读,我会对不同方法的特征和性能进行广泛的比较。 (使用库或自制代码)

答案 2 :(得分:1)

这样就没有必要去第三方使用SQLBulk Copy而不是

 public static  void BulInsert()
    {
        var destination = @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = SampleDatabase; Integrated Security = True; Connect Timeout = 30; Encrypt = False; TrustServerCertificate = False; "; // your comnnection string

        var filename = @"d:\db.csv";//your source file
        var connString = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=No;FMT=Delimited""", Path.GetDirectoryName(filename));
        string query = string.Format("Select * from [{0}]", Path.GetFileName(filename));
        using (var conn = new OleDbConnection(connString))
        {
            conn.Open();

            OleDbCommand command = new OleDbCommand(query, conn);
            var reader = command.ExecuteReader();
            using (SqlConnection destConnection = new SqlConnection(destination))
            {
                try
                {
                    destConnection.Open();
                    using (SqlBulkCopy bulkCopy =
                      new SqlBulkCopy(destConnection))
                    {

                        // what ever mapping with ordinal
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(0, "Id"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(1, "name"));
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(2, "visit"));
                        bulkCopy.DestinationTableName =
                            "dbo.Patients";

                        try
                        {
                            bulkCopy.WriteToServer(reader);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                        finally
                        {

                            reader.Close();
                        }
                    }
                }
                catch (Exception)
                {

                }

            }
        }

    }

答案 3 :(得分:0)

如果要将CSV转换为Datatable或将容量批量导入CSV转换为sqlserver,可以使用Cinchoo ETL库。

要将CSV转换为datatable,下面的代码显示了如何执行此操作

using (var p = new ChoCSVReader("emp.csv").WithFirstLineHeader())
{
    DataTable dt = p.AsDataTable();
}

如果要将CSV批量导入sqlserver,可以参考此代码项目文章,了解如何执行此操作。

Cinchoo ETL - Bulk Insert CSV File into SQLServer

希望这有帮助。

免责声明:我是这个图书馆的作者。