我正在使用mysqlimport
使用bash脚本将5个不同的csv
文件导入到公共数据库表中。
File[0]=one
File[1]=two
File[2]=three
File[3]=four
File[4]=five
for i in 0 1 2 3 4 5 6 7 8 9 10
do
mysqlimport --fields-optionally-enclosed-by=\" --fields-terminated-by=, --lines-terminated-by="<br />\n" -uusername -ppassword --local tablename /path/${File[i]}.txt
done
现在我想在公共表中添加一个额外的列,每个文件都有一个唯一的id。例如。对于one.csv的所有条目,id将具有值1.
有没有办法可以在通过bash脚本导入的同时执行此操作?我不想每次都去mysql控制台并从那里开始。
任何建议都表示赞赏。
答案 0 :(得分:2)
首先,mysqlimport只是LOAD DATA INFILE
SQL statement的包装,虽然mysqlimport是一个很好的方便,但它有一些限制会使你想要做的事情变得困难,即:
set
字段到给定值,但作为mysqlimport的选项不存在(虽然它确实存在于裸SQL上! )因此,你可能想跳过mysqlimport并直接执行sql语句。
这样的事情应该做:
File[0]=one
File[1]=two
File[2]=three
File[3]=four
File[4]=five
for i in 0 1 2 3 4 5 6 7 8 9 10
do
qry="LOAD DATA LOCAL INFILE '/path/${File[i]}.txt' INTO TABLE tablename FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\"' LINES TERMINATED BY \"<br />\n\" (list,comma,separated,column,names,here) SET source_id='$i'"
mysql -uusername -ppassword << eof
$qry
eof
done
SET source_id='$i'
字段是导入时设置该字段的关键。
注意:此代码未经测试,但它应该让您朝着正确的方向前进,只需阅读LOAD DATA INFILE
的mysql手册,然后google“mysql bash”。
答案 1 :(得分:0)
这样的方法怎么样:
#!/bin/bash
echo>/tmp/tmpfile.csv
for i in 0 1 2 3 4 5 6 7 8 9 10
do
for j in `cat ${FILE[i]}.TXT`; do echo $i,$j>>/tmp/tmpfile.csv; done
done
mysqlimport ..... --table localfile /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv
当然这是不完整/未经测试的代码,但您可以首先创建一个包含已添加列的完整文件,然后导入该文件。
你也可以绕过mysqlimport并类似地构造sql:
#!/bin/bash
echo>/tmp/tmpfile.csv
for i in 0 1 2 3 4 5 6 7 8 9 10
do
for j in `cat ${FILE[i]}.TXT`; do echo "insert into tablename (a,b,c,d,e) values ($i,$j);">>/tmp/tmpfile.csv; done
done
mysql -D dbname -u user --password=pass < /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv