【问题标题】:Import csv to SQLServer when there are spaces after the text qualifier文本限定符后有空格时将 csv 导入 SQLServer
【发布时间】:2017-09-22 13:42:52
【问题描述】:

我有一个包含 GeoCodes 列的 csv 文件。这使用 " 作为文本限定符。

我正在尝试使用 SQL Server 导入向导将其导入 SQLServer。 数据的问题是,如果没有 GeoCode,csv 文件有时会将 GeoCode 输出为“”,然后是几个空格。尝试导入数据时出现此错误,因为它会在文本限定符中提取数据,然后在下一个逗号分隔符之前有这些空格。

以下数据示例。 Pontypandy 行是出错的行。

Place      ,Geo Codes           ,Type                          
Northpole  ,"90.0000,0.0000    ",Pole                          
Southpole  ,"-90.0000,0.0000   ",Pole                          
Pyramids   ,"29.9765,31.1313   ",BigTriangle                   
France     ,"                  ",Country                       
Pontypandy ," "                 ,City                          

我必须使用文本限定符,因为地理代码中有逗号。

我对如何将数据发送给我没有发言权,因此必须按原样处理数据。

作为一种解决方法,我必须先在记事本中查找和替换数据,然后再导入。这为希望不需要的工作增加了一个额外的步骤。

在导入期间我是否可以绕过 " " 空格

作为额外说明,我目前无法访问 SSIS,但如果可以更轻松地在其中完成,请回答,因为它可以帮助我证明获得 SSIS 的合理性(如果以后我可能不得不删除此评论我必须把它展示给我的经理)。

【问题讨论】:

  • 一个快速的解决方法是使用 Notepad++ 并使用查找 / 替换 "\s, to ",。我不明白您的 CSV 是如何或为什么这样做的。你是手动输入引号吗?通常当引用 csv 时,所有列都会被引用。
  • 我在问题中提到我正在使用类似的工作。因为我必须经常这样做,所以我正在寻找一些更标准的导入。如果可以的话。
  • 不知道为什么数据会这样出来。我认为当没有输入任何内容时,它会出现一个“围绕所有内容。我认为当有人删除数据时它会出现错误。虽然我不处理那个系统,所以不能在那里改变任何东西
  • 如果你有 powershell,你可以在一个脚本中自动清理和导入
  • @Jimbo 谢谢,我可能会看看。

标签: sql-server csv import sql-import-wizard


【解决方案1】:

如果您的数据确实是您在上面显示的方式,您可以使用固定宽度格式。按原样导入数据,然后替换 "。这不是最好的解决方案。

更好:在导入之前通过 sed 管道导入文件。这不仅要快得多,而且在所有情况下,当数据大于 RAM 时,这是唯一简单的方法(好吧,还有其他一些方法)。您只需要在操作系统级别进行 sed。如果您可以将可执行文件复制到某处,那么这就是您所需要的。如果你想用“替换“[任意数量的空白],这是正则表达式应该是:

cat myfile.txt|sed -b -e "s/\" *,/\",/">yournewfile.txt

一旦你明白了正则表达式就很容易了: - s 表示替代, - /first /second/ 表示查找第一个并替换为第二个, - \" 是转义的 " (因为 DOS) - 空格和 * 表示任意数量的空格 - , 表示 ,

在很多系统上 sed 仍然存在 (cygwin)。玩得开心!

【讨论】:

    【解决方案2】:

    批量插入的两种方法

    1. 基于行的批量插入
      • 在 CSV 中有字符串限定的列时最有用
      • 您需要先创建一个包含两个字段的表:identity & varchar(max); identity 将表示行数,varchar(max) 将是您的行数据
      • 创建一个仅从上表中选择 varchar(max) 字段的视图

    批量插入语法如下所示:

    BULK INSERT AdventureWorks2012.Sales.v_SalesOrderDetail  
    FROM 'f:\orders\lineitem.csv'  
        WITH   (  
            ROWTERMINATOR =' |\n'  
        );  
    
    1. 基于列的插入:
      • 大多数人都广泛使用它,但只有在没有字符串限定的列时才有用且可靠。
      • 将最常见的批量插入语法与RowTerminatorLineTerminator 选项结合使用

    参考资料:

    【讨论】:

    • @ChrisM 确保使用适当的Char 键来标识行或列分隔符。这将有助于区分 Unix 和 Windows 格式文件之间的独特差异
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    相关资源
    最近更新 更多