从 CSV SQL 批量导入
-
01-07-2019 - |
题
我需要将大型 CSV 文件导入 SQL 服务器。我正在使用这个:
BULK
INSERT CSVTest
FROM 'c:\csvfile.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
问题是我的所有字段都被引号(“”)包围,所以一行实际上看起来像:
"1","","2","","sometimes with comma , inside", ""
我可以以某种方式批量导入它们并告诉 SQL 使用引号作为字段分隔符吗?
编辑: :使用 '","' 作为分隔符的问题是,如示例所示:大多数示例所做的就是导入数据,包括第一列中的第一个“和最后一列中的最后一个”,然后继续将其删除。唉,我的第一列(也是最后一列)是日期时间,不允许将“20080902 作为日期时间导入。
根据我一直在阅读的内容,我认为 FORMATFILE 是可行的方法,但文档(包括 MSDN)非常无用。
解决方案
我知道这不是真正的解决方案,但我使用虚拟表进行导入,并为所有内容设置了 nvarchar 。然后我进行插入,删除“字符并进行转换。它不漂亮,但它能完成工作。
其他提示
尝试 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,"'")")
填充可以将其填充到每一行中。然后只需将输出复制并粘贴到新的查询窗口中即可。
这是老派的做法,但如果您只需要偶尔进行一次导入,那么您就可以不用花时间阅读所有有关“正确”方法的晦涩文档。
尝试 开放行集. 。这可用于导入 Excel 内容。Excel可以打开CSV文件,因此您只需找出正确的[ConnectionString][2]即可。
[2]:驱动程序={微软文本驱动程序(*.txt;*.csv)};Dbq=c: xtFilesFolder\;扩展名=asc,csv,tab,txt;
我想说使用 FileHelpers 它是一个开源库
您是否需要以编程方式执行此操作,还是一次性执行?
使用企业管理器,右键单击“导入数据”可以选择分隔符。
您必须注意 BCP/BULK INSERT,因为如果引用不一致,BSP 或批量插入都无法很好地处理此问题,即使使用格式文件(甚至 XML 格式文件也不提供该选项)和虚拟 ["] 字符开始和结束并使用 [","] 作为分隔符。从技术上讲,如果没有嵌入的 [,] 字符,CSV 文件不需要包含 ["] 字符
正是由于这个原因,逗号分隔的文件有时被称为喜剧限制文件。
OpenRowSet 需要服务器上有 Excel,并且在 64 位环境中可能会出现问题 - 我知道在 64 位环境中使用 Jet 中的 Excel 会出现问题。
如果文件将来可能与您的预期有所不同,SSIS 确实是您最好的选择。
您可以尝试此代码,如果您愿意,这将是非常甜蜜的,这将从您的代码中删除不需要的半洛龙。例如,如果您的数据是这样的:
“凯利”,“雷诺”,“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);
}
}
}
}
}
是的,K Richard 是对的: FIELDTERMINATOR = '","'
看 http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file 了解更多信息。
您还可以使用 DTS 或 SSIS。
您可以控制输入格式吗?| (管道),并且 t通常可以为更好的现场终止器提供。
如果您弄清楚如何将文件解析为 DataTable,我建议使用 SqlBulkInsert 类将其插入 SQL Server。
这是一个老问题,所以我写这篇文章是为了帮助任何偶然发现它的人。
SQL Server 2017 引入了FIELDQUOTE 参数,该参数正是针对这种用例。