是csv的样本行
012,12/11/2013,"<555523051548>KRISHNA KUMAR ASHOKU,AR",<10-12-2013>,555523051548,12/11/2013,"13,012.55",
你可以看到 KRISHNA KUMAR ASHOKU,AR 作为单个字段,但由于逗号,它将KRISHNA KUMAR ASHOKU和AR视为两个不同的字段,尽管它们附有&#34;但仍然没有运气
我试过
BULK
INSERT tbl
FROM 'd:\1.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW=2
)
GO
有什么解决方案吗?
答案 0 :(得分:11)
答案是:你做不到。请参阅http://technet.microsoft.com/en-us/library/ms188365.aspx。
“从CSV文件导入数据
SQL Server批量导入操作不支持逗号分隔值(CSV)文件。但是,在某些情况下,CSV文件可用作将数据批量导入SQL Server的数据文件。有关从CSV数据文件导入数据的要求的信息,请参阅为批量导出或导入准备数据(SQL Server)。“
一般解决方案是您必须将CSV文件转换为可以成功导入的文件。您可以通过多种方式执行此操作,例如使用不同的分隔符(例如TAB)创建文件,或者使用了解CSV文件(例如Excel或许多脚本语言)的工具导入表格并使用唯一的方法导出表格分隔符(例如TAB),然后可以从BULK INSERT。
答案 1 :(得分:5)
不幸的是,SQL Server导入方法(BCP&amp;&amp; BULK INSERT)不理解引用“”
来源:http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
答案 2 :(得分:3)
我最近遇到过这个问题,不得不切换到制表符分隔格式。如果您这样做并使用SQL Server Management Studio进行导入(右键单击数据库,然后选择“任务”,然后选择“导入”)制表符分隔的工作正常。带制表符分隔的批量插入选项也应该有效。
当我发现Microsoft SQL Server有这个以逗号分隔的问题时,我必须承认非常惊讶。 CSV文件格式非常古老,因此发现这是现代数据库的问题非常令人失望。
答案 3 :(得分:1)
MS现在已经解决了这个问题,您可以在with子句中使用FIELDQUOTE来添加带引号的字符串支持:
FIELDQUOTE = '"',
如果您使用的是SQL Server 2017或更高版本,with子句中的任何地方都可以解决问题。
答案 4 :(得分:0)
他们添加了对此SQL Server 2017(14.x)CTP 1.1的支持。您需要对BULK INSERT命令使用FORMAT ='CSV'输入文件选项。
要清楚,这是csv给我带来的问题,第一行易于解析,第二行包含曲线球,因为引号字段内有逗号:
jenkins-2019-09-25_cve-2019-10401,CVE-2019-10401,4,Jenkins Advisory 2019-09-25: CVE-2019-10401:
jenkins-2019-09-25_cve-2019-10403_cve-2019-10404,"CVE-2019-10404,CVE-2019-10403",4,Jenkins Advisory 2019-09-25: CVE-2019-10403: CVE-2019-10404:
断码
BULK INSERT temp
FROM 'c:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
FIRSTROW= 2
);
工作代码
BULK INSERT temp
FROM 'c:\test.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
FORMAT = 'CSV',
FIRSTROW= 2
);
答案 5 :(得分:-1)
嗯,Bulk Insert非常快,但不是很灵活。您可以将数据加载到临时表中,然后将所有内容都推送到生产表中吗?进入SQL Server后,您可以更好地控制将数据从一个表移动到另一个表的方式。所以,基本上。
def print_table(n):
# Make a string containing '1 2 3 4 5 6 7 8 9 10'
row = ' '.join(str(x) for x in range(1, 11))
# Print n rows
for i in range(1, n + 1):
print(str(i) + ' | ' + row)