从CSV导入SQL批量导入

时间:2008-09-18 20:17:14

标签: sql sql-server tsql bulkinsert

我需要将一个大型CSV文件导入SQL服务器。我正在使用这个:

BULK 
INSERT CSVTest
        FROM 'c:\csvfile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

问题是我的所有字段都被引号(“”)包围,所以一行实际上看起来像:

"1","","2","","sometimes with comma , inside", "" 

我可以以某种方式批量导入它们并告诉SQL使用引号作为字段分隔符吗?

编辑:使用'\ n','作为分隔符的问题,如建议的示例中所示:  大多数例子的作用是,他们导入的数据包括第一个“在第一列和最后一个”中的数据,然后他们继续并将其删除。我的第一个(也是最后一个)列是datetime,不允许将“20080902”导入为datetime。

从我一直在阅读的内容来看,我认为FORMATFILE是可行的方式,但文档(包括MSDN)非常缺乏帮助。

14 个答案:

答案 0 :(得分:13)

尝试FIELDTERMINATOR='","'

这是一个很好的链接,以帮助第一个和最后一个引用...看看他如何使用SP的子串

http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

答案 1 :(得分:9)

我有时使用的另一个黑客是在Excel中打开CSV,然后将sql语句写入每行末尾的单元格中。 例如:

=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")

填充可以将此填充到每行中。然后只需将输出复制并粘贴到新的查询窗口中。

这是老派,但是如果你只需要偶尔进行一次进口,那么就可以省去阅读所有晦涩难懂的文件,并以“正确”的方式去做。

答案 2 :(得分:4)

试试OpenRowSet。这可以用来导入Excel的东西。 Excel可以打开CSV文件,因此您只需要找出正确的[ConnectionString] [2]。

[2]:Driver = {Microsoft Text Driver(* .txt; * .csv)}; Dbq = c:\ txtFilesFolder \; Extensions = asc,csv,tab,txt;

答案 3 :(得分:3)

我知道这不是一个真正的解决方案,但我使用虚拟表进行导入,并为所有内容设置了nvarchar。然后我做了一个插入,删除了“字符并进行了转换。它不是很漂亮,但是它完成了工作。

答案 4 :(得分:2)

我想说使用FileHelpers是一个开源库

答案 5 :(得分:1)

您是否需要以编程方式执行此操作,还是一次性拍摄?

使用企业管理器,右键单击“导入数据”,可以选择分隔符。

答案 6 :(得分:1)

你必须注意BCP / BULK INSERT,因为如果引用不一致,BSP或Bulk Insert都不能很好地处理这个问题,即使是格式文件(即使XML格式文件不提供选项)和虚拟[“]开头和结尾的字符,并使用[“,”]作为分隔符。技术上,如果没有嵌入的[,]字符,CSV文件不需要[“]字符

正因如此,以逗号分隔的文件有时被称为喜剧限制文件。

OpenRowSet将需要服务器上的Excel,并且在64位环境中可能会出现问题 - 我知道在64位Jet中使用Excel会有问题。

如果档案可能与您未来的期望有所不同,那么SSIS确实是您最好的选择。

答案 7 :(得分:1)

你可以试试这个非常甜蜜的代码,如果你愿意的话 这将从您的代码中删除不需要的分号。 例如,您的数据是这样的:
“Kelly”,“Reynold”,“kelly @reynold.com”

Bulk insert test1
from 'c:\1.txt' with ( 
    fieldterminator ='","'
    ,rowterminator='\n')

update test1<br>
set name =Substring (name , 2,len(name))
where name like **' "% '**

update test1
set email=substring(email, 1,len(email)-1)
where email like **' %" '**

答案 8 :(得分:1)

首先需要将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);
                }
            }
        }
    }
}

答案 9 :(得分:0)

是的,K Richard是对的:FIELDTERMINATOR = '","'

有关详细信息,请参阅http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

答案 10 :(得分:0)

您也可以使用DTS或SSIS。

答案 11 :(得分:0)

您是否可以控制输入格式? | (管道),\ t \ t通常用于更好的现场终结器。

答案 12 :(得分:0)

如果您弄清楚如何将文件解析为DataTable,我建议使用SqlBulkInsert类将其插入SQL Server。

答案 13 :(得分:0)

这是一个古老的问题,所以我写这篇文章是为了帮助那些偶然发现它的人。

SQL Server 2017引入了用于此确切用例的FIELDQUOTE参数。