2012-02-09 11 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の、Amt_Nr最後の行で

[[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`を「」欠けている::;; PLZ Ortと

これは、私は上記のスニペットで得るものです

最後の `

希望誰かが私のためのミッシングリンクを持っているが欠落している

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

....

Greetz ミルコ

答えて

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 BY' TERMINATED TABLE Zustaendigkeit フィールドに ';'; –

+0

それで 'awk'スクリプトの' NR == 1 '部分だけを使って 'CREATE TABLE'文を生成することができます。 –

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行はカンマなしで必要です:どのヒントも非常に高く評価されています –

+0

http://stackoverflow.com/questions/3576139/sed-remove-string-only-the-last-of-the-fileは、このトリックをやったのです... –