【问题标题】:SSIS: How to delimit columns at specific indexesSSIS:如何在特定索引处分隔列
【发布时间】:2017-06-22 18:12:35
【问题描述】:

我有一个格式如下的文本文件:

+------------+-----------------+--------------+-----------+
| Field Name | Starting Column | Field Length | Data Type |
+------------+-----------------+--------------+-----------+
| ID         |               1 |           12 | A         |
| DATE       |              13 |            8 | Date      |
| NAME       |              21 |           80 | A         |
| ADDRESS    |             101 |           12 | A         |
| ...        |             ... |          ... | ...       |
+------------+-----------------+--------------+-----------+

我们可以在这里看到“起始列”是列开头的索引。因此,起始列与字段长度相结合,为我们提供了每列的最大大小。

我一直在使用 Fixed Width 选项,它似乎有点用,但我得到了这些奇怪的黑盒子,它们似乎正在改变一切。

【问题讨论】:

  • 用文本编辑器打开文件时看到什么字符?文件保存为什么文本编码?许多 Microsoft 产品不支持 UTF-8,这是几乎所有常见非 Microsoft 系统的标准。
  • 没有看到您的原始文本文件,我们真的无能为力。
  • 那些黑框是行尾的 LF 和 CR 字符。只需将您的红线 2 个空格移至允许这些字符,它应该可以解决问题。我自己也经历了同样的事情,有一个巨大的固定宽度的源文件(数百列,数千个字符)。我感觉到你的痛苦......

标签: ssis sql-server-2016


【解决方案1】:

在尝试了建议的解决方案并执行more research 之后,我找到了this 线程,这导致我尝试了平面文件连接管理器中的ragged right 选项,从而解决了我的问题。正如@Jacob H 建议的那样,这两个黑色字符确实是换行符(LF-ASCII 字符 10)和回车符(CR-ASCII 字符 13)。

注意:我还必须在我命名为Ignore 的末尾添加一个额外的列。这是因为否则,它不会让我为最后一列添加数据长度信息。

我希望这对将来的其他人有所帮助,因为 ragged right 不是很直观。

【讨论】:

    【解决方案2】:

    这两个黑色字符是 换行(LF-ASCII 字符 10)和 回车(CR-ASCII 字符 13)字符,它们表示每行的结尾.

    您会注意到屏幕截图中的每一行都移动了 2 个点。随后的行移动了 2 个额外的点。第 2 行移动了 4,第 3 行移动了 6,依此类推。由于 SQL 将这些字符计入您的总固定宽度,因此您的行将累积缩短 2。

    要解决此问题,请将红色行尾行向左移动两个字符。您还需要调整最终的列宽以匹配规范。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多