1

我使用bash 脚本mysqlimport将 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 控制台并从那里开始。

任何建议表示赞赏。

4

2 回答 2

2

首先,mysqlimport只是LOAD DATA INFILESQL 语句的包装器,虽然 mysqlimport 很方便,但它有一些限制会使您尝试做的事情变得困难,即:

  1. 您不能指定表名,它从文件名推断表名
  2. 您希望使用的选项,您可以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'字段是在导入时设置该字段的关键。

注意:此代码未经测试,但它应该让您朝着正确的方向前进,只需阅读 mysql 手册LOAD DATA INFILE,然后在 Google 上搜索“mysql bash”。

于 2012-11-30T20:33:49.037 回答
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
于 2012-11-30T20:46:55.240 回答