2016-01-21 114 views
1

我有一个没有文本限定符的大型管道界定文本文件,它看起来像吐出这个文件的任何东西都会在最后一列中每隔几百行就意外地吐出虚假的“LF”标记。 最后一列是一个描述性列,并且它不像任何应该的文本限定。 文件看起来与此类似:SSIS平面文件导入中的不一致行尾

id|data|data|data|data|Description[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|Descr[LF] 
iption[LF] 
id|data|data|data|data|Description[LF] 
Id|data|data|data|data|Description[LF] 
id|data|data|data|data|Descripti[LF] 
on[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|Description[LF] 
id|data|data|data|data|D[LF] 
escription[LF] 

我是很新,SSIS和SQL一般,有没有人对如何解决这一问题有什么建议?

+0

您可能需要手动修复文件,但您可能会在预处理脚本任务中一起修复该文件。 SSIS不能很好地处理这样的不规则行 – billinkc

+0

'手工'的替代方法是将文件导入一个具有足够大的VarChar字段的表(每个文件行一个记录)。您可能能够更好地将它在t-sql中以编程方式组合在一起。 – InbetweenWeekends

+0

如果最后一行是描述列,则可能是用户输入,其中换行可能是输入的一部分。该列需要进行分隔,否则需要删除描述内的换行。如果您对文件的创建者有任何影响,我会坚持要他们实现这两个步骤中的一个,并告诉他们为了让您能够导入文件是绝对必要的。 –

回答

0

如果我不得不猜测,我会说这是由于文件是如何创建的......你可能有数据只是恰好包含某些特殊字符而被错误地解释为一行饲料。

请检查此site以查看问题行中的数据是否与这些编码中的任何一个匹配。如果是这种情况,那么最终你有两种选择:

1)创建一些复杂和复杂的ETL process来检测和更正文件数据,然后再处理它。这是不明智的,因为这将是创建和维护的主要难题。

2)尝试改变这个文件的生成方式。大多数文本导出向导将允许您在文本项目周围放置引号(“),以便您的导入过程可以快速检测到文本块的某些内容,而不是一系列编码字符来解释。

1

我确实找到了一种方法修复它在记事本++,因为我不知道C#,我不知道SSIS不够好..

ID是8位长,然后是7个空格。这是这个文件绝对唯一。

在记事本+ +我用(查找扩展),以查找和替换“\ n”(LF)与无

然后我用了个为查找表达式:

(\d\d\d\d\d\d\d\d[[:blank:]][[:blank:]][[:blank:]][[:blank:]][[:blank:]][[:blank:]][[:blank:]]) 

,找到所有8位数字7个尾随空格,以及用于更换,使用这样的:

\r\n\1 

把一个[CR] [LF]在这些前8位数字。

瞧,它工作! 但无论哪种方式..我的老板联系客户,并要求更好的文件。现在我获得了荣誉,并获得了正确的数据。谢谢你的建议!

+0

这是一件好事,而不是每天的数据输入 – BinaryPatrick

+0

这就是我正在学习的东西。这是每月的Feed。它将在下次更正,虽然 –

+0

在这种情况下,您可以将正则表达式处理添加到文件,但您需要将它作为一个大字符串加载,重新划分它,然后将该元素读入新结构。我认为你可以在原始SQL中使用它作为一堆嵌套的SELECT语句和字符串替换。 – BinaryPatrick