[英]SQL Bulk import from CSV
我需要将一个大型CSV文件导入SQL服务器。 我正在使用这个:
BULK
INSERT CSVTest
FROM 'c:\csvfile.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
问题是我的所有字段都被引号(“”)包围,所以一行实际上看起来像:
"1","","2","","sometimes with comma , inside", ""
我可以以某种方式批量导入它们并告诉SQL使用引号作为字段分隔符吗?
编辑 :使用'“,”作为分隔符的问题,如在建议的示例中那样:大多数示例的作用是,它们是否导入数据,包括第一个“在第一列和最后一个”在最后,然后他们继续把它剥离出来。 我的第一个(也是最后一个)列是datetime,不允许将“20080902”导入为datetime。
从我一直在阅读的内容来看,我认为FORMATFILE是可行的方式,但文档(包括MSDN)非常缺乏帮助。
试试FIELDTERMINATOR='","'
这是一个很好的链接,以帮助第一个和最后一个引用...看看他如何使用SP的子串
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
我有时使用的另一个黑客是在Excel中打开CSV,然后将sql语句写入每行末尾的单元格中。 例如:
=concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")
填充可以将此填充到每行中。 然后只需将输出复制并粘贴到新的查询窗口中。
这是老式学校,但如果你只需要偶尔进行一次进口,那么就可以省去阅读所有晦涩难懂的文件,并以“正确”的方式去做。
试试OpenRowSet 。 这可以用来导入Excel的东西。 Excel可以打开CSV文件,因此您只需要找出正确的[ConnectionString] [2]。
[2]:Driver = {Microsoft Text Driver(* .txt; * .csv)}; Dbq = c:\\ txtFilesFolder \\; Extensions = asc,csv,tab,txt;
我知道这不是一个真正的解决方案,但我使用虚拟表进行导入,并为所有内容设置了nvarchar。 然后我做一个插入,删除“字符并进行转换。它不漂亮,但它完成了工作。
我想说使用FileHelpers是一个开源库
如果你愿意,你可以尝试这个非常甜的代码,这将从你的代码中删除不需要的分号。 例如,您的数据是这样的:
“凯利”, “雷诺”, “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 **' %" '**
您需要将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);
}
}
}
}
}
你需要以编程方式执行此操作,还是一次性拍摄?
使用企业管理器,右键单击“导入数据”,可以选择分隔符。
您必须注意BCP / BULK INSERT,因为如果引用不一致,即使格式文件(甚至XML格式文件不提供选项)和虚拟[“]字符,BSP或批量插入都不能很好地处理这个问题。开始和结束并使用[“,”]作为分隔符。如果没有嵌入的[,]字符,技术上CSV文件不需要有[“]字符
出于这个原因,逗号分隔的文件有时被称为喜剧限制文件。
OpenRowSet将需要服务器上的Excel,并且在64位环境中可能会出现问题 - 我知道在64位Jet中使用Excel会有问题。
如果文件可能与您未来的期望有所不同,那么SSIS确实是您最好的选择。
这是一个老问题,所以我写这个是为了帮助任何偶然发现它的人。
SQL Server 2017引入了FIELDQUOTE参数,该参数适用于此确切用例。
是的,K Richard是对的: FIELDTERMINATOR = '","'
有关详细信息,请参见http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file 。
您也可以使用DTS或SSIS。
你能控制输入格式吗? | (管道),\\ t \\ t通常用于更好的现场终结器。
如果您弄清楚如何将文件解析为DataTable,我建议使用SqlBulkInsert类将其插入SQL Server。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.