【问题标题】:Flat File Connection Manager Text Qualifier Setup SSIS平面文件连接管理器文本限定符设置 SSIS
【发布时间】:2016-03-28 23:36:18
【问题描述】:

我正在使用带有平面文件连接管理器的 SSIS 包,如下图所示,格式:分隔,文本限定符为 "。所有列均以逗号分隔。但是我有一个我的表中的 ItemDescription 列包含 Box Dimension 2" 而不是 Box Dimension 2 in. 或 Box Dimension 2 inches 等数据,例如。这会导致生成的 csv 文件在遇到我的包中的那个点时创建另一列。关于如何在不获取另一列的情况下完成这项工作的任何建议?

[]

更新,这里是作为输出的文本文件的原始数据,这里的示例是 SupplyID 929,ItemDescription "Box Fiberboard 2""。还有 supplyID 525 和 888

"SupplyID","ProtocolName","AssayName","ItemNumber","ItemDescription","PackagingUnits","SupplyCost","CatalogNumber","SetChildItemsToInclude","PrimaryStatus","SecondaryStatus"
    "1531","XXXXXX","XXXXXX XXXXXX","XXXXXX-XXXXXX","XXXXXX XXXXXX: XXXXXX A (100% XXXXXX XXXXXX) and B (80% XXXXXX XXXXXX + 20% DMSO)","1","0","BD368632","","False","False"
    "368","XXXXXX","XXXXXX XXXXXX","XXXX001","XXXXXX XXXXXX","250","0.16","STP-150","","False","False"
    "369","XXXXXX","XXXXXX XXXXXX","XXXX002","XXXXXX XXXXXX","100","0.03","326895","","False","False"
    "370","XXXXXX","XXXXXX XXXXXX","XXXX003","XXXXXXXXXXX, 20 G (Insyte)","50","3.39","BD 381433 ","","False","False"
    "371","XXXXXX","XXXXXX XXXXXX","XXXX004","XXXXXXXXXXX, 22 G (Insyte)","50","3.39","BD 381423","","False","False"
    "372","XXXXXX","XXXXXX XXXXXX","XXXX006","XXXX XXXX XXXXXXXXXXX (BD)","200","1.09","BD 364880","","False","False"
    "929","XXXXXX","XXXXXX XXXXXX","XXXX007","Box Fiberboard 2"","1","5.41","","","True","False"
    "525","XXXXXX","XXXXXX XXXXXX","XXXX126","Parafilm M XXXXXX, 2" x 250 feet (Ref# PM992), 1 XXXXXX Each","1","42.12","13-374-16","","False","False"
    "888","XXXXXX","XXXXXX XXXXXX","XXXX152","XXXXXX XXXXXX, 21G w/12" XXXXXX, XXXXXX lock","50","1.65","","","False","False"

【问题讨论】:

  • 我在我的系统上尝试过,csv 中的输出看起来是正确的。文本中的 " 是一个双引号还是两个单引号?
  • 谢谢@Bob Klimes 这是双引号。
  • 为了让我们清楚源数据的样子,您能否在文本编辑器中打开源文件(记事本有效)并将ItemNumber 的部分复制到PackagingUnits
  • 源数据在表中包含一列 ItemDescription,其中包含 Box Dimension 2" 等数据,而不是 Box Dimension 2 in.. 这种格式依赖于另一个系统,该系统控制我无法更改其中的数据。
  • 你误会了,我想看一行的例子,最好是其中包含 2" 值的行,前面和后面的列。像 1234,"Box Dimension2"",456 或 "1234","Box Dimension2"","456" 或然而源系统已生成数据。没有 CSV 标准,因此每个人对这些东西的工作方式都有自己的内部规则

标签: sql-server-2008 ssis delimiter flat-file


【解决方案1】:

如果不查看原始数据,很难准确判断问题所在。在屏幕截图中,最重要的字符被删除了(如, 和")。

如果您能提供部分原始数据,我们将能够为您提供更好的帮助。 (例如:有些字段也可以是多行的)

但是,我的表中有一个 ItemDescription 列,其中包含诸如 Box Dimension 2" 而不是 Box Dimension 2 in. 或 Box Dimension 2 英寸等数据。这会导致生成的 csv 文件在生成时创建另一列击中我包裹中的那个点。

那些额外的列几乎肯定存在,因为在没有被引号正确包围的字段中有额外的,。

一些一般规则:

  • (仅)在字段中有分隔符时需要引号。如果字段被引号包围,则该字段内的引号必须用另一个引号转义 - 例如:"27"" monitor, black"。

  • 如果平面文件确实格式不正确,则永远不应接受它,因为从长远来看,这只会带来更多麻烦。在这种情况下,唯一“正确”的解决方案是“要求”数据提供者发送格式正确的数据。

从长远来看,尝试“修复”(导入)格式错误的平面文件不仅会带来更多麻烦(尤其是在定期更新数据时),而且通常还会使越来越多的格式错误的数据四处飘浮(如果 mallformed 的提供者知道它已修复,他们可能不会费心自己修复它)。

编辑(现在查看原始数据)

我查看了原始数据,确实数据格式错误:

,"Box Fiberboard 2"", 应该是,"Box Fiberboard 2""",

例如,,"Needles Butterfly, 21G w/12" tubing, luer lock", 应该是 ,"Needles Butterfly, 21G w/12"" tubing, luer lock",。

因此,理想情况下,这些数据应该在源头固定。

如果这是不可能的,可能会有某种 hack(但不推荐),即拆分 "," 上的行 - 因为所有字段都被引用,所以你可以侥幸逃脱,但你必须修剪剩余 " 的第一个和最后一个字段。

【讨论】:

    【解决方案2】:

    选项#1临时修复是将文件转换为管道“|”分隔。

    选项#2 用双引号“part1,part2”逗号将所有列括在列值内。在你的情况下,“Box Dimention 2,boxkalai”。

    【讨论】:

    • 我已经尝试过选项#1,但没有成功。源数据在表中包含一个 ItemDescription 列,其中包含 Box Dimension 2" 而不是 Box Dimension 2 in. 等数据。这种格式依赖于另一个控制我无法更改其中数据的系统。
    猜你喜欢
    • 2013-06-12
    • 2014-10-16
    • 2014-12-27
    • 2016-01-27
    • 1970-01-01
    • 2023-04-11
    • 2016-11-09
    • 2011-03-20
    • 2019-10-11
    相关资源
    最近更新 更多