簡體   English   中英

如何將數據從CSV文件批量復制到SQL?

[英]How to bulk copy data from CSV file to SQL?

我這樣嘗試過:

    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萬行以上。 請提出一些想法或建議。

您可以使用OLEDB通過SQL(kinda)查詢來讀取CSV文件:

請以示例的形式查看此答案: 在.NET中處理大型csv的最有效方法

您還可以使用現有的庫,例如FileHelpers: http//www.filehelpers.net/,它允許輕松,快速地解析大型CSV文件。

總是會以某種方式執行循環以讀取文件,分割行並將其插入DataTable。
有許多免費的庫可用於CSV文件,如果您執行簡單的搜索,您將非常容易找到它們。

但是,您的代碼可以得到改進(並固定),方法是在該循環中僅將行拆分一次而不是四次,並僅用一行添加一行(實際上,您的代碼為每行添加了4行,這似乎是錯誤的)

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

如果這足以滿足您的要求,則由您自己評估。 要讀取這么多行,我將對不同方法的功能和性能進行廣泛的比較。 (使用庫或自制代碼)

這是正常工作,無需第三方使用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)
                {

                }

            }
        }

    }

如果要將CSV轉換為Datatable或將CSV輕松批量導入sqlserver,則可以使用Cinchoo ETL庫。

要將CSV轉換為數據表,下面的代碼說明了如何進行

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

如果要批量導入CSV到sqlserver,可以參考此代碼項目文章中的操作方法。

Cinchoo ETL-將CSV文件批量插入SQLServer

希望這可以幫助。

免責聲明:我是該庫的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM