导入CSV文件到SQL服务器

我正在寻求帮助,使用 "BULK INSERT "将一个".csv "文件导入SQL Server,我有几个基本问题。

问题:

1.CSV文件的数据之间可能有,(逗号)(例如:描述),那么我怎样才能使导入处理这些数据?

2.2.如果客户从Excel创建CSV,那么有逗号的数据会被括在""(双引号)内[如下例],那么导入时如何处理?

3.3.如果有些行的数据不好,我们如何跟踪,导入时跳过这些行?(导入时是否跳过了不能导入的行)

以下是带标题的CSV样本。

Name,Class,Subject,ExamDate,Mark,Description
Prabhat,4,Math,2/10/2013,25,Test data for prabhat.
Murari,5,Science,2/11/2013,24,"Test data for his's test, where we can test 2nd ROW, Test."
sanjay,4,Science,,25,Test Only.

和导入的SQL语句。

BULK INSERT SchoolsTemp
FROM 'C:\CSVData\Schools.csv'
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    TABLOCK
)
解决办法

基于SQL Server的CSV导入

  1. CSV文件的数据中间可能有,(逗号)(例如。 description),那么我怎样才能导入处理这些数据?

解决方案

如果你使用,(逗号)作为分隔符,那么就没有办法区分作为字段结束符的逗号和数据中的逗号。我会使用一个不同的FIELDTERMINATOR,如||。代码会是这样的,这将完美地处理逗号和单斜线。

  1. 如果客户从excel创建csv,那么带有 逗号被括在"... "(双引号)内[如下图所示 例子] 那么导入时如何处理这个问题?

解决方案

如果你使用BULK插入,那么没有办法处理双引号,数据将被插入到 数据将以双引号插入行中。 在将数据插入到表中后,你可以用'`'替换这些双引号。

update table
set columnhavingdoublequotes = replace(columnhavingdoublequotes,'"','')

3)如果有些行的数据不好,导入时跳过,我们如何跟踪? (导入时是否跳过了不能导入的行)?

解决方案

要处理那些因为无效数据或格式而没有被加载到表中的行,可以采用以下方法 使用ERRORFILE属性处理,指定错误文件名,它将把有错误的行写入错误文件。 代码应该是这样的。

BULK INSERT SchoolsTemp
    FROM 'C:\CSVData\Schools.csv'
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '\n',   --Use to shift the control to next row
    ERRORFILE = 'C:\CSVDATA\SchoolsErrorRows.csv',
    TABLOCK
    )
评论(5)

解决数据中的逗号问题的最好、最快速和最简单的方法是在将Windows'列表分隔符设置为逗号以外的东西(如管道)后,使用Excel保存一个逗号分隔文件。 这将为你生成一个管道(或其他)分离的文件,然后你可以导入。 这方面的描述是这里

评论(0)

首先,你需要将CSV文件导入数据表中。

然后你可以使用SQLBulkCopy插入大量行

using System;
using System.Data;
using System.Data.SqlClient;

namespace SqlBulkInsertExample
{
    class Program
    {
      static void Main(string[] args)
        {
            DataTable prodSalesData = new DataTable("ProductSalesData");

            // Create Column 1: SaleDate
            DataColumn dateColumn = new DataColumn();
            dateColumn.DataType = Type.GetType("System.DateTime");
            dateColumn.ColumnName = "SaleDate";

            // Create Column 2: ProductName
            DataColumn productNameColumn = new DataColumn();
            productNameColumn.ColumnName = "ProductName";

            // Create Column 3: TotalSales
            DataColumn totalSalesColumn = new DataColumn();
            totalSalesColumn.DataType = Type.GetType("System.Int32");
            totalSalesColumn.ColumnName = "TotalSales";

            // Add the columns to the ProductSalesData DataTable
            prodSalesData.Columns.Add(dateColumn);
            prodSalesData.Columns.Add(productNameColumn);
            prodSalesData.Columns.Add(totalSalesColumn);

            // Let's populate the datatable with our stats.
            // You can add as many rows as you want here!

            // Create a new row
            DataRow dailyProductSalesRow = prodSalesData.NewRow();
            dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
            dailyProductSalesRow["ProductName"] = "Nike";
            dailyProductSalesRow["TotalSales"] = 10;

            // Add the row to the ProductSalesData DataTable
            prodSalesData.Rows.Add(dailyProductSalesRow);

            // Copy the DataTable to SQL Server using SqlBulkCopy
            using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
            {
                dbConnection.Open();
                using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                {
                    s.DestinationTableName = prodSalesData.TableName;

                    foreach (var column in prodSalesData.Columns)
                        s.ColumnMappings.Add(column.ToString(), column.ToString());

                    s.WriteToServer(prodSalesData);
                }
            }
        }
    }
}
评论(1)