Ker*_*mit 8 sql-server csv import
我正在使用XML格式文件导入CSV文件,并且第一个数据行被跳过.我无法弄清楚为什么.
格式文件
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='\n' />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="COLUMN1" xsi:type="SQLVARYCHAR" />
<COLUMN SOURCE="2" NAME="COLUMN2" xsi:type="SQLVARYCHAR" />
</ROW>
</BCPFORMAT>
Run Code Online (Sandbox Code Playgroud)
CSV
COLUMN1,COLUMN2
"ABC","ABC123456"
"TNT","TNT123456"
Run Code Online (Sandbox Code Playgroud)
询问
SELECT *
FROM OPENROWSET(BULK 'C:\sample.csv',
FORMATFILE='C:\sample.xml',
FIRSTROW = 2) AS a
Run Code Online (Sandbox Code Playgroud)
结果
COLUMN1 COLUMN2
------- ----------
"TNT TNT123456"
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
如果FIRSTROW
更改为1
,结果将变为:
COLUMN1 COLUMN2
--------------------- ----------
COLUMN1,COLUMN2 "ABC ABC123456"
"TNT TNT123456"
Run Code Online (Sandbox Code Playgroud)
如果标题行已从CSV中删除并FIRSTROW
更改为1
,则结果将按预期返回:
COLUMN1 COLUMN2
------- ----------
"ABC ABC123456"
"TNT TNT123456"
Run Code Online (Sandbox Code Playgroud)
由于这是一个带有标题的自动报告,是否还有其他选项可以解决这个问题?
这里有几个问题:
\n
我怀疑第一行没有有效的。否则,当您更改为 时,SQL Server 不会修改前两行FIRSTROW = 1
。
用作","
列分隔符对于除第一列和最后一列之外的所有列都非常有效。"
这会在第一列上留下前导,并"
在最后一列上留下尾随。ROWTERMINATOR
您可以通过更改to来处理后者"\n
,但这只有在您还可以"
向标题行添加尾随时才有效(在确保那里有效的过程中\n
)。此时,您不妨确保标题行在所有方面都与数据行匹配,因此:
"COLUMN1","COLUMN2"
-------------------^ this character has to be \n
Run Code Online (Sandbox Code Playgroud)老实说,我认为您可以花一周的时间来解决所有这些细节BCP
和BULK INSERT
问题,但仍然没有一个不需要后期操作的完美解决方案(例如修剪"
某些列中的前导/尾随字符) 。"
我的建议:花 20 分钟用 C# 编写一个解析器,它会在 SQL Server 看到文件之前自动更正这些文件 - 删除标题行、确保正确的分隔符就位、删除所有愚蠢的等。清理文件比你现在要跳过的麻烦要少得多。我确信这个问题有解决方案,但 IIRC 你已经为此奋斗了相当长一段时间......
归档时间: |
|
查看次数: |
6060 次 |
最近记录: |