2012-02-09 93 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