【问题标题】:CSV import in SQL Server 2008SQL Server 2008 中的 CSV 导入
【发布时间】:2011-04-01 08:48:21
【问题描述】:

我有一个 csv 文件,它的列值用双引号括起来。

我想使用 sql 语句从网络路径导入 csv 文件。

我尝试了批量插入。但它与双引号一起导入。有没有其他方法可以通过忽略文本限定符双引号使用 sql 语句将 csv 文件导入 SQL Server 2008?

谢谢 -Vivek

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    这是导入带有文本分隔符的文件时的一个已知问题,因为 bcp/批量插入实用程序不允许您指定文本分隔符。请参阅this link 进行良好的讨论。

    【讨论】:

      【解决方案2】:

      您可以使用non-xml format file 为每列指定不同的分隔符。对于用双引号括起来并由制表符分隔的值,分隔符可以是\",\"。您必须添加一个初始未使用的列来捕获第一个引号。比如读取这个文件:

      "row1col1","row1col2","row1col3"
      "row2col1","row2col2","row2col3"
      "row3col1","row3col2","row3col3"
      

      你可以使用这个格式文件:

      10.0
      4
      1  SQLCHAR 0 50 "\""     0 unused ""
      2  SQLCHAR 0 50 "\",\""  1 col1   ""
      3  SQLCHAR 0 50 "\",\""  2 col2   ""
      4  SQLCHAR 0 50 "\"\r\n" 3 col3   ""
      

      (第一行的数字取决于SQL Server版本。第二行的数字是要读取的列数。别忘了调整一下。)

      bulk insert 命令接受formatfile = 'format_file_path' 参数,您可以在其中指定格式文件。例如:

      BULK INSERT YourTable
      FROM 'c:\test\test.csv'
      WITH (FORMATFILE = 'c:\test\test.cfmt')
      

      这会导致:

      select * from YourTable
      -->
      col1        col2        col3
      row1col1    row1col2    row1col3
      row2col1    row2col2    row2col3
      row3col1    row3col2    row3col3
      

      【讨论】:

      • 这是否仍会让您在第一个字段中使用前导双引号,在最后一个字段中使用尾随双引号?
      • @Joe Stefanelli:您可以在未使用的字段中捕获前导引号,并在最后一个字段的终止符中捕获尾随引号。我已经测试了我发布的示例,它适用于 SQL Server 2008(BCP 版本为 10.0)
      • +1 做得很好。我不会想到使用一个未使用的字段作为前导引号。
      • 嗨,andomar,在我的 csv 中,有些列会用双引号括起来,而有些则不会。是否可以将此双引号设为可选? _V
      • @Vivek Chandraprakash:不这么认为。您可以不带引号导入,然后像 update YourTable set col1 = substring(col1,2,len(col1)-2) where col1 like '"%"' 一样删除它们
      【解决方案3】:

      @Andomar 的回答让我在 99% 的路上遇到了一个非常相似的问题。但是,我发现 SQL Server 2014 无法导入最后一行,因为最后一个字段没有换行符:\r\n。 所以我的格式文件看起来更像:

      12.0
      4
      1   SQLCHAR 0   50  "\""    0   unused  ""
      2   SQLCHAR 0   50  "\",\"" 1   col1    ""
      3   SQLCHAR 0   50  "\",\"" 2   col2    ""
      4   SQLCHAR 0   50  "\""    3   col3    ""
      

      所以对于我的文件,它有一行字段名称,导入 SQL 变成:

      BULK INSERT MyTable
      FROM 'C:\mypath\datafile.csv'
      WITH (
          FIRSTROW = 2,
          FORMATFILE = 'C:\mypath\formatfile.cfmt',
          ROWTERMINATOR = '\r\n'
      )
      

      实际的 CSV 有 40 个字段,因此在 Microsoft's website 上阅读不必写列名(col1 - col40 工作正常)以及每行中的第四个参数很有帮助- 示例中的50,只需要最大字段长度,不精确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多