【问题标题】:Add a column while using mysqlimport使用 mysqlimport 时添加列
【发布时间】:2012-11-30 18:54:12
【问题描述】:

我正在使用 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 控制台并从那里开始。

欢迎提出任何建议。

【问题讨论】:

    标签: mysql mysqlimport


    【解决方案1】:

    首先,mysqlimport 只是LOAD DATA INFILE SQL statement 的一个包装器,虽然 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' 字段是在导入时设置该字段的关键。

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

    【讨论】:

    • 谢谢。 LOAD DATA 更​​加灵活。
    【解决方案2】:

    这样的方法怎么样:

    #!/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
    

    【讨论】:

    • 如果你错过了:`cat file.txt` 会给你每个文件的每一行,所以你可以很容易地在每一行前面添加一些东西。或者如果你愿意,可以在最后。
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2011-11-30
    • 2022-09-23
    • 1970-01-01
    • 2015-12-21
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多