BULK INSERT / OPENROWSET的FormatFile端接器,用于CSV文件用,(逗

2019-10-17 00:17发布

我已经写了我的百万行的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数据逗号? (还是我刚才说的文件必须制表符分隔)?

Answer 1:

如果您的字段终止符可以在数据中出现,那么它可能是最好使用TAB或竖线分隔符(或任何为您的数据有效)。

如果数据中出现终止符,它被解释为一个终止符,而不是数据,并且该字符后的数据被解释为属于下一个字段或记录。 因此,仔细选择您的终止符,以确保它们不会出现在你的数据

http://msdn.microsoft.com/en-us/library/ms191485.aspx



Answer 2:

数据字段中的分隔符是分隔的文件的共同问题。 一些常见的战术来解决这个问题包括:

  1. 重建具有剥离出来,他们被写入文件之前的数据字段的分隔符的所有出现的数据文件:这消除OPENROWSET错误,但不保留数据的完整性。
  2. 重新创建具有不同的分隔符的数据文件:在我的经验,一个标签分隔符是一个更好的选择。 这是不常见的遭遇比数据中的逗号制表符。 但它肯定不是闻所未闻的。 我看到的数据中的多个标签了。
  3. 双引号引起的数据字段:这需要一些调整,以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终结者),我做了一个受过教育的猜测, NameStreet均达到128 characters--根据需要编辑。

问题:

  1. OPENROWSET()查询将返回Reference与一家领先的"双引号字符。正因为如此...
  2. 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