【问题标题】:Importing a CSV file using BULK INSERT command into SQL Server table使用 BULK INSERT 命令将 CSV 文件导入 SQL Server 表
【发布时间】:2013-01-13 16:22:55
【问题描述】:

我有一个包含几个数据列的 CSV 文件。

CSV 文件看起来像

字段1:测试1
字段 2:测试 2
字段3:Test3,Test4,Test5

在这种情况下,我可以使用哪个库作为字段终止符,我的意思是如果我使用此查询将 CSV 文件插入到 shopifyitem 表中,因为您假设数据字段插入不正确

BULK INSERT shopifyitem
FROM 'c:\test.csv'
WITH
(
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '\n'
)

那么我可以使用哪个字段终止符

在此先感谢您....

【问题讨论】:

  • 对我来说这根本不像 CSV 文件。应该是Test1,Test2,"Test3,Test4,Test5"
  • @AaronBertrand:虽然 Bulk Insert 也无法正确解析。
  • @RBarryYoung 对,我并不是说格式会神奇地起作用,只是 OP 现在拥有的是 不是 CSV。无论如何,当您有古怪的格式、嵌入的逗号等时,您要么需要更改格式或使用其他东西 - SSIS、预解析器、带有格式文件的 BCP 等。很难确定,因为我仍然没有认为我们在问题中看到的正是文件的样子。
  • @AaronBertrand 遗憾的是,Sql Server 内置 nothing 可以正确解析带有引号字段的 CSV,而不是带有格式文件的 BCP,甚至不能正确解析 SSIS。您可以做的最好的事情是使用 SQLBulkCopy 自行滚动,或者将行作为原始文本导入 NVarchar(MAX),然后使用自定义 SQL 解析它们。对不起,这对我来说是个痛点......
  • 请发布您尝试插入的数据样本。正如 Aaron Bertrand 评论的那样,您的数据不是 CSV 格式。还包括您要插入的表的 DDL。

标签: sql-server insert bulk


【解决方案1】:

尝试使用:
ROWTERMINATOR = '0x0a'

【讨论】:

  • 感谢换行符,除了堆栈溢出,我在其他任何地方都找不到它
【解决方案2】:
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);
                }
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    这是将文本或csv文件导入数据库的代码:

    String SQL = "BULK INSERT [staging_db].[dbo].[TEST] FROM 'D:\\test.txt' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')";
    

    【讨论】:

      【解决方案4】:

      我认为如果不进行某种类型的预处理,您将无法导入该格式。正如 Aaron 暗示的那样,这不是标准的 CSV。

      如果您无法重新格式化文件,有几种方法可以将数据转换为可导入的格式:

      http://www.timmitchell.net/post/2013/01/14/ragged-flat-file-processing-in-ssis/

      http://www.rad.pasfu.com/index.php?/archives/38-Script-Component-as-Source-SSIS.html

      http://msdn.microsoft.com/en-us/library/ms136060.aspx(向下滚动到“平面文件源示例”)

      这些都是利用 .NET 完成大部分工作的 SSIS 解决方案。我更喜欢 SSIS 仅仅是因为内置的生产力工具。它可以使用任何文本处理器来完成,例如控制台应用程序或 powershell 脚本(如果您真的有时间的话)。

      我更喜欢带有流阅读器的脚本组件源,但 Tim Mitchell 有一个有趣的替代方案。

      【讨论】:

      • 我无法理解 sql server 不能完美地导入文件,而 'FREE' mysql 可以!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多