2012-02-09 143 views
0

我試圖從csv文件生成SQL表頭。當我遇到了一些麻煩我寫了一個測試片斷,這裏就是我這麼遠:bash腳本中的字符串修改

#!/bin/bash 
function quote { 
    for i ; do 
#  echo "\`$i\`" 
     echo "\`$i\` varchar (100),\n" 
    done 
} 

quote $(head -1 Zustaendigkeit.csv | sed 's/;/ /g') 

這是CSV行我用:

茨;大街; PLZ_Ort;土地;金額; Amt_Nr ; PLZ;的Ort

這就是我得到了上面的代碼片段:

[[email protected] ~] 
174# ./tst.sh 
`Netz` varchar (100),\n 
`Strasse` varchar (100),\n 
`PLZ_Ort` varchar (100),\n 
`Land` varchar (100),\n 
`Amt` varchar (100),\n 
`Amt_Nr` varchar (100),\n 
`PLZ` varchar (100),\n 
` varchar (100),\n 

在最後一行它缺少Ort at the beginning of the line. When I use only "echo "\ $ i`「」這是在上面的代碼中,我得到這樣評論道:

[[email protected] ~] 
170# ./tst.sh 
`Netz` 
`Strasse` 
`PLZ_Ort` 
`Land` 
`Amt` 
`Amt_Nr` 
`PLZ` 
`Ort 

這是丟掉了最後`

希望有人有缺失的一環,我....

格爾茨 的Mirco

回答

1

爲什麼不awk?我曾經這樣做過:

awk -v Q="'" -F "," 'NR==1 { print "create table SOMETABLE (" 
           for (i=1;i<NF;i++) { 
            print $i " varchar2(100), " 
           } 
           print $NF " varchar2(100));" 
         } 
         NR%1000 == 0 { print "commit;" } 
         { print "insert into SOMETABLE values (" 
         for (i=1;i<NF;i++) { 
          print Q $i Q ", " 
         } 
         print Q $NF Q ");" 
         } 
         END { print "commit;" 
          print "exit;" 
         }' INPUT.CSV > SQL.sql 
+0

要加載我使用數據:LOAD DATA INFILE '/path/to/Zustaendigkeit.csv' INTO TABLE Zustaendigkeit 場TERMINATED BY ';'; – 2012-02-09 12:30:37

+0

那麼你可以只使用'awk'腳本的'NR == 1'部分來生成'CREATE TABLE'語句。 – 2012-02-09 12:44:16

2

您可能在行尾有Windows行結束符。刪除它:sed 's/\r//g'

除了使用sed,您可以使用循環並將IFS設置爲;\r的移除是通過參數擴展完成的。

IFS=';' 
read -a a < Zustaendigkeit.csv 
for b in "${a[@]}" ; do 
    echo "\`${b%$'\r'}\` varchar(100)" 
done 
+0

Thx那是我的Prob現在已經解決了...在varchar後添加了一個逗號,但是我需要最後一個echo'd行沒有逗號:任何提示都非常感謝 – 2012-02-09 16:43:39

+0

http://stackoverflow.com/questions/3576139/sed-remove-string-only-in-the-line-of-the-the-file did the trick ... – 2012-02-09 17:32:30