2016-01-21 109 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