将CSV文件导入SQL Server

问题描述 投票:168回答:9

我正在寻求使用.csvBULK INSERT文件导入SQL Server的帮助,我有几个基本问​​题。

问题:

  1. CSV文件数据之间可能有,(逗号)(例如:描述),那么如何进行导入处理这些数据?

  2. 如果客户端从Excel创建CSV,则将逗号分隔的数据括在""(双引号)中[如下例所示],那么导入如何处理呢?

  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 sql-server csv bulkinsert bulk
9个回答
154
投票

基于SQL Server CSV导入

1)CSV文件数据之间可能有,(逗号)(例如:说明),那么如何进行导入处理这些数据?

解决方案>>

如果您使用,(逗号)作为分隔符,则无法区分作为字段终止符的逗号和数据中的逗号。我会使用不同的FIELDTERMINATOR,例如||。代码看起来像这样,它将完美地处理逗号和单斜杠。

2)如果客户端从excel创建csv,则具有逗号括在" ... "(双引号)中[如下示例],那么导入如何处理呢?

解决方案>>

如果您使用的是大容量插入,则无法处理双引号,数据将被用双引号插入行中。将数据插入表后,可以用“ ”替换那些双引号。

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

3)我们如何跟踪某些行是否包含不良数据,哪些导入会跳过?(导入会跳过不可导入的行)吗?

解决方案>>

要处理由于无效数据或格式而未加载到表中的行,可以使用ERRORFILE property处理,指定错误文件名,它将写入行错误文件有错误。代码应如下所示。

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
    )
 

[您首先需要在数据库中创建一个表,您将在其中导入CSV文件。创建表后,请执行以下步骤。

•使用SQL Server Management Studio登录到数据库

•右键单击数据库,然后选择Tasks -> Import Data...

•单击Next >按钮

•对于数据源,选择Flat File Source。然后使用浏览按钮选择CSV文件。在单击Next >按钮之前,花一些时间配置要如何导入数据。

•对于目标,选择正确的数据库提供程序(例如,对于SQL Server 2012,您可以使用SQL Server Native Client 11.0)。输入服务器名称。检查Use SQL Server Authentication单选按钮。在单击Next >按钮之前,输入用户名,密码和数据库。

•在“选择源表和视图”窗口上,可以在单击Next >按钮之前编辑映射。

•选中Run immediately复选框,然后单击Next >按钮。

•单击Finish按钮运行程序包。

在此website上发现了以上内容(我已经使用并测试了它:]

2)如果客户端从excel创建csv,则具有逗号括在“ ...”(双引号)内[如下示例],那么导入如何处理呢?

您应该使用FORMAT ='CSV',FIELDQUOTE ='“'选项:

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

解决数据问题中逗号的最佳,最快和最简便的方法是,在将Windows的列表分隔符设置设置为逗号(例如管道)之外的其他内容之后,使用Excel保存逗号分隔的文件。然后将为您生成一个管道(或其他)分隔的文件,然后可以将其导入。描述为here

需要将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. 只需将CSV文件另存为excel中的XLS工作表(这样做,您就不必担心定界符。Excel的电子表格格式将被读取为表格并直接导入到SQL表格中)

] >
  • 使用SSIS导入文件

  • [在导入管理器中编写自定义脚本以省略/修改您要查找的数据。(或运行主脚本来仔细检查您要删除的数据)

  • 祝你好运。>>

    由于他们不使用SQL导入向导,因此步骤如下:

    << img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9hVktzMy5wbmcifQ==” alt =“在此处输入图像说明”>

    1. 右键单击选项导入任务

      数据,
    中的数据库
  • 一旦向导

    打开,我们选择要隐含的数据类型。在这种情况下,它将是

    平面文件源

  • 我们选择了CSV文件,您可以在CSV中配置表格的数据类型,但是最好从CSV中导入它。

    1. 单击下一步,然后选择最后一个选项

    SQL客户端

    根据身份验证的类型,我们选择它,一旦完成,就会出现一个非常重要的选项。

    1. 我们可以在CSV中定义表格的ID(建议将CSV的列的名称与表格中的字段相同)。在选项“编辑映射”中,我们可以在电子表格的列中看到每个表的预览,如果我们希望向导默认情况下插入ID,请取消选中该选项。

    启用ID插入

    ((通常不是从1开始),如果我们在CSV中有一列带有ID的列,则选择启用ID插入,下一步是结束向导,我们可以在此处查看更改。

    另一方面,在接下来的窗口中可能会出现警报,或者警告,如果它们留下错误,则最好忽略此]。

    This link has images

    首先打开excel,然后将其导入DATA,从TXT文件导入,选择将保留0个前缀值的csv扩展名,然后将该列另存为TEXT,因为excel会删除前导0,否则将该文件导入Excel。如果您在以0 [零]开头的字段中包含数字数据,请双击以使用Excel打开。然后只需另存为制表符分隔文本文件即可。当您导入到excel中时,您可以选择另存为GENERAL,TEXT等。选择TEXT,这样还可以保留诸如YourCompany,LLC之类的字段中字符串中间的引号...

    BULK INSERT dbo.YourTableName
    FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
    WITH (
    FirstRow = 2, (if skipping a header row)
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR   = '\n'
    )
    

    我希望我可以使用FORMAT和Fieldquote功能,但是我的SSMS版本似乎不支持该功能

    我知道已经接受了答案,但是我仍然想分享我的情况,也许可以帮助某人解决他们的问题工具

    • ASP.NET
    • EF代码优先方法
    • SSMS
  • EXCEL
  • SCENARIO

    我正在加载CSV格式的数据集,稍后将其显示在视图中我尝试使用批量加载,但由于BULK LOAD正在使用,因此无法加载
    FIELDTERMINATOR = ','
    

    并且Excel单元格也使用,但是,我也不能直接使用Flat file source,因为我正在使用Code-First Approach并仅在SSMS DB中创建了模型,而在后来不得不使用属性的模型中没有这样做。

    SOLUTION

    1. 我使用了平面文件源并从CSV文件制作了数据库表(在SSMS中右键单击数据库->导入平面文件->选择CSV路径并按照指示进行所有设置]]]]

  • Visual Studio中的模型类(您必须保留所有数据类型和名称与sql中加载的CSV文件的名称相同]
  • 在NuGet软件包控制台中使用Add-Migration
  • 更新数据库

  • 25
    投票

    [您首先需要在数据库中创建一个表,您将在其中导入CSV文件。创建表后,请执行以下步骤。

    •使用SQL Server Management Studio登录到数据库


    19
    投票

    2)如果客户端从excel创建csv,则具有逗号括在“ ...”(双引号)内[如下示例],那么导入如何处理呢?


    10
    投票

    解决数据问题中逗号的最佳,最快和最简便的方法是,在将Windows的列表分隔符设置设置为逗号(例如管道)之外的其他内容之后,使用Excel保存逗号分隔的文件。然后将为您生成一个管道(或其他)分隔的文件,然后可以将其导入。描述为here


    4
    投票

    需要将CSV文件导入到数据表中的文件

    然后您可以使用SQLBulkCopy插入批量行


    3
    投票

    这是我要解决的方法:

    1. 只需将CSV文件另存为excel中的XLS工作表(这样做,您就不必担心定界符。Excel的电子表格格式将被读取为表格并直接导入到SQL表格中)


    2
    投票

    由于他们不使用SQL导入向导,因此步骤如下:

    << img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9hVktzMy5wbmcifQ==” alt =“在此处输入图像说明”>

    1. 右键单击选项导入任务

      数据,

    0
    投票

    首先打开excel,然后将其导入DATA,从TXT文件导入,选择将保留0个前缀值的csv扩展名,然后将该列另存为TEXT,因为excel会删除前导0,否则将该文件导入Excel。如果您在以0 [零]开头的字段中包含数字数据,请双击以使用Excel打开。然后只需另存为制表符分隔文本文件即可。当您导入到excel中时,您可以选择另存为GENERAL,TEXT等。选择TEXT,这样还可以保留诸如YourCompany,LLC之类的字段中字符串中间的引号...

    BULK INSERT dbo.YourTableName
    FROM 'C:\Users\Steve\Downloads\yourfiletoIMPORT.txt'
    WITH (
    FirstRow = 2, (if skipping a header row)
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR   = '\n'
    )
    

    我希望我可以使用FORMAT和Fieldquote功能,但是我的SSMS版本似乎不支持该功能


    0
    投票

    我知道已经接受了答案,但是我仍然想分享我的情况,也许可以帮助某人解决他们的问题工具

    © www.soinside.com 2019 - 2024. All rights reserved.