2009-10-08 56 views
0

我有一個CSV文件,我想根據文件中的字段進行分割。基本上,可以有兩個品牌,GVA和HBVL。我想在將文件導入數據庫之前將文件分割成每個品牌的文件。使用sed動態生成文件名

樣品的CSV文件的問題

"D509379D5055821451C3695A3752DCCD",'1900-01-01 01:00:00',"M","1740","GVA",'2009-07-01 13:25:00',0 
"159A58BE41012787D531C7157F688D86",'1900-01-01 00:00:00',"V","1880","GVA",'2008-06-06 11:21:00',0 
"D0BB5C058794BBE4478DDA536D1E4872",'1900-01-01 00:00:00',"M","9270","GVA",'2007-09-18 13:21:00',0 
"BCC7096803E5E60E05DC12FB9951E0CF",'1900-01-01 00:00:00',"M","3500","HBVL",'2007-09-18 13:21:00',1 
"7F85FCE6F13775A8A3054E3438B81599",'1900-01-01 00:00:00',"M","3970","HBVL",'2007-09-18 13:20:00',0 

部分是文件的大小。這是約39mb。我在此的初始嘗試如下所示:

while read line ; do 

    name=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\2/ p' | tr [:upper:] [:lower:] ` 
    info=`echo $line | sed -n 's/\(.*\)"\(GVA\|HBVL\)",\(.*\)$/\1\3/ p'` 

    echo "${info}" >> ${BASEDIR}/${today}/${name}.txt 

done < ${file} 

大約2.5小時後,只處理了大約1/2的文件。我還有另一個文件可能達到250 MB,我無法想象需要多長時間。

我想要做的就是拔出品牌,並將行寫入以品牌命名的文件。我可以刪除品牌,但我現在不用如何使用它來創建文件。我已經開始使用sed了,但如果更合適,我不會再使用其他語言。

+1

不使用bash的同時讀取線結構來讀取大文件,特別是如果你同時使用外部命令,像sed,或在循環TR在一起。它會極大地減緩你的處理速度。使用內部解析文件的工具,例如awk – ghostdog74 2009-10-09 00:01:36

回答

3

每行有多個命令的原始while循環是DIRE!

sed -e '/"GVA"/w gva.file' -e '/"HBVL"/w hbvl.file' -n $file 

sed腳本說:匹配GVA標記,

  • 寫行gva.file匹配的HBVL標籤hbvl.file
  • 和不
  • 寫入線打印其他任何東西('-n')

請注意,不同版本的sed可以處理不同數量的輔助文件。如果您一次只需要20個以上的輸出文件,則可能需要查看其他技術(但要測試機器上的限制)。如果對文件進行排序,以便所有GVA記錄一起顯示,然後顯示所有的HBVL記錄,則可以考慮使用csplit。或者,像Perl這樣的腳本語言可以處理更多。如果超過了允許進程的文件描述符的數量,則很難通過數據文件進行一次分割。

+1

注意:您仍然可以使用以下技術剝離品牌字段:'sed -n -e'/「GVA」/ s/\(。* \)「\(GVA \) 「,\(。* \)$/\ 1 \ 3/w gva.file'-e'...' – 2009-10-08 23:42:57

+0

我知道我是過度思考的東西。我真的不應該在這麼晚的時候解決這樣的問題。 – cabuki 2009-10-09 10:01:30

1
grep '"GVA"' $file >GVA.txt 
grep '"HVBL"' $file >HVBL.txt 
+0

每個文件有兩個命令 - 優於每行幾個,但仍然較慢... – 2009-10-08 22:29:31

+0

它可能不是最快的解決方案,但它可能足夠接近。當然很容易理解。 – 2009-10-08 22:30:31

+0

如果文件非常大,那麼使用grep無需經歷2次文件迭代。最好一次通過文件並獲得所需的東西。 – ghostdog74 2009-10-09 00:04:26

1
# awk -F"," '{o=$5;gsub(/\"/,"",o);print $0 > o}' OFS="," file 
# more GVA 
"D509379D5055821451C3695A3752DCCD",'1900-01-01 01:00:00',"M","1740","GVA",'2009-07-01 13:25:00',0 
"159A58BE41012787D531C7157F688D86",'1900-01-01 00:00:00',"V","1880","GVA",'2008-06-06 11:21:00',0 
"D0BB5C058794BBE4478DDA536D1E4872",'1900-01-01 00:00:00',"M","9270","GVA",'2007-09-18 13:21:00',0 
# more HBVL 
"BCC7096803E5E60E05DC12FB9951E0CF",'1900-01-01 00:00:00',"M","3500","HBVL",'2007-09-18 13:21:00',1 
"7F85FCE6F13775A8A3054E3438B81599",'1900-01-01 00:00:00',"M","3970","HBVL",'2007-09-18 13:20:00',0 
+0

...希望這些引用的文字中沒有逗號... – 2009-10-09 02:55:16