2013-03-28 79 views
1

的我有這樣閱讀平坦的文件與不平坦的沒有。列

**0, xyz, 20130301121212 
1, 6997,
2,, 5678999, Y, 11, 20130301 
2,, 5678988, Y, 11, 20130301 
1, 6647,
2,, 5678999, Y, 11, 20130301 
2,, 5678988, Y, 11, 20130301 
9, 8** 

行0是標頭csv文件,1名的是用於不同的商店和2組的所有的產品細節記錄

行與2(作爲第一列)是細節與第1行(作爲第一列)商店的

可以有一個人請告訴我如何分組這些行2與對應1的

+0

不理解最後一條語句,「將這兩個2與相應的1進行分組,但我可以告訴您先寫一個ETL以將數據加載到表中,更好地將其加載到2個表中。 – ljh 2013-03-28 06:38:43

+1

歡迎來到StackOverflow!你是否嘗試過任何你可以分享的內容,以便更容易理解你的問題?關於StackOverflow的最佳問題包括一個明確的問題,迄今爲止嘗試的內容摘要,你嘗試的結果,以及你期望的結果所有這些東西都會讓你的問題更清晰,更容易回答。 – 2013-03-28 06:56:11

+0

@ljh我的意思是如何將行與2(第一列)分組,行數爲1(第一列)。如果你觀察上面的文件有不均勻的沒有。列,我如何將其保存到數據表。請幫助。 – CSharped 2013-03-28 07:05:34

回答

0

我沒有使用SQL Server和我只能提供一般性指導:

1)將文件加載到數據庫中,在列中整行,添加行的行號。結果會是這樣的(rid是行號):

rid rline 
1 1, 6997,
2 2,, 5678999, Y, 11, 20130301 
3 2,, 5678988, Y, 11, 20130301 
4 1, 6647,
5 2,, 5678999, Y, 11, 20130301 
6 2,, 5678988, Y, 11, 20130301 

2)使用一些SQL來獲得所需形狀數據。這意味着,你必須找到第一個與2每一行未測試前一個1行:

select 
    csvdata.rline, 
    csvdata.rid, 
    (select rline from csvdata x where rline like '1,%' and x.rid < csvdata.rid order by x.rid desc limit 1) as TopRline 
from 
    csvdata 
where 
    rline like '2,%' -- this will limit lines to only those with the detail 

希望,這將產生以下結果有三列:

rid rline         TopRline  
2 2,, 5678999, Y, 11, 20130301 1, 6997,
3 2,, 5678988, Y, 11, 20130301 1, 6997,
5 2,, 5678999, Y, 11, 20130301 1, 6647,
6 2,, 5678988, Y, 11, 20130301 1, 6647,

3)拆分數據使用一些SQL函數到列中(例如在PostgreSQL中,text_to_array()會這樣做)。假設2的結果存儲在表溫度,然後類似:

select 
    (string_to_array(rline,','))[1] as column1, 
    (string_to_array(rline,','))[2] as column2, 
    (string_to_array(rline,','))[3] as column3, 
    (string_to_array(rline,','))[4] as column4, 
    (string_to_array(rline,','))[5] as column5, 
    (string_to_array(rline,','))[6] as column6, 
    (string_to_array(TopRline,','))[1] as column1top, 
    (string_to_array(TopRline,','))[2] as column2top, 
    (string_to_array(TopRline,','))[3] as column3top, 
from 
    temp 

4)將數據存儲在任何您想要的表中。

0

注意到SSIS在鋸齒狀CSV中的困難,我會在SSIS運行的CMD中做一些前期工作,以便您可以使用標準的CSV功能。加載到兩個單獨的表,然後只加入共享密鑰列上的表。

首先將鋸齒狀文件中的行拆分爲非鋸齒狀文件。在Windows中,像下面這樣的東西應該可以做到。

findstr /b "1," InputFile.txt > InputFileRow_1.txt
findstr /b "2," InputFile.txt > InputFileRow_2.txt

然後InputFileRow_1.txt和InputFileRow_2.txt使用SSIS標準CSV功能集成到表InputFileRow_1和InputFileRow_2表加載。

最後,像下面的東西組。

SELECT * 
FROM InputFileRow_1 ifr1 
INNER JOIN InputFileRow_2 ifr2 
ON ifr1.RowType2_ID = ifr2.RowType2_ID 

*這個方法可能是從取決於行類型的文件分佈和文件大小的IO角度浪費。