我已经写了我的百万行的CSV一个不错的进口是相当不错的工作(使用OPENROWSET BULK(因为我需要交叉与其他一些列的加入,我没有使用BULK INSERT)。该FORMATFILE使用逗号作为终结者。
下面是我用开发CSV的例子:
Reference, Name, Street
1,Dave Smith, 1 Test Street
2,Sally SMith,1 Test Street
一旦我得到它的工作,有人提醒我说,数据本身可能有一个逗号在里面,哎呦!!!!
Reference, Name, Street
"1","Dave Smith", "1 Test Street"
"2","Sally Smith","1,Test Street" <-comma in street
人们是如何应对的CSV在使用FormatFiles数据逗号? (还是我刚才说的文件必须制表符分隔)?
如果您的字段终止符可以在数据中出现,那么它可能是最好使用TAB或竖线分隔符(或任何为您的数据有效)。
如果数据中出现终止符,它被解释为一个终止符,而不是数据,并且该字符后的数据被解释为属于下一个字段或记录。 因此,仔细选择您的终止符,以确保它们不会出现在你的数据
http://msdn.microsoft.com/en-us/library/ms191485.aspx
数据字段中的分隔符是分隔的文件的共同问题。 一些常见的战术来解决这个问题包括:
- 重建具有剥离出来,他们被写入文件之前的数据字段的分隔符的所有出现的数据文件:这消除OPENROWSET错误,但不保留数据的完整性。
- 重新创建具有不同的分隔符的数据文件:在我的经验,一个标签分隔符是一个更好的选择。 这是不常见的遭遇比数据中的逗号制表符。 但它肯定不是闻所未闻的。 我看到的数据中的多个标签了。
- 双引号引起的数据字段:这需要一些调整,以XML格式文件。
编辑data文件可能做的,能够对任何上述选项。 但它可能是乏味的,特别是对于大型文件。 (刚刚开场的几个GB的在Notepad.exe的一个文件是耐心的练习。)实际上,你要为你的作者重新创建它。 选择1应该总是“工作”。 但同样的情况,您可能无法忍受数据完整性问题。 方案2将可能对很多情况下工作,但它不是防弹。 选项#3是不防弹要么(它总是可能有一个数据段中的分隔符),但它是关于尽可能靠近你可以得到的。 此外,它保持数据的完整性。
这是一个可能性,你的XML格式的文件:
<?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='","' MAX_LENGTH="5"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='"\r\n' MAX_LENGTH="128" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Reference" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="Name" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="Street" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
注意字段终止:我用单引号识别","
终止子和"\r\n
。作为行终止(栏3终结者),我做了一个受过教育的猜测, Name
和Street
均达到128 characters--根据需要编辑。
问题:
- OPENROWSET()查询将返回
Reference
与一家领先的"
双引号字符。正因为如此... -
Reference
不能返回作为INT(或SMALLINT,BIGINT等)。 它被返回为VARCHAR( xsi:type="SQLVARYCHAR"
对于所提供的特定数据样本,我请从双引号Reference
的数据字段,调整XML格式的文件,使得FIELD ID="1"
具有TERMINATOR=',"'
,并进一步调整XML格式的文件,使得COLUMN SOURCE="1"
具有xsi:type="SQLINT"
对于一些额外的信息,这篇博客文章可能有帮助: 入门OPENROWSET和BULK行集提供-第2部分
文章来源: BULK INSERT / OPENROWSET FormatFile Terminator for CSV file with , (comma) in the data