如何使用shell脚本在mysql数据库的不同字段中插入文件的内容?

时间:2017-11-21 16:38:11

标签: mysql shell

我正在尝试扫描文件夹中的新文件并读取这些文件并将其内容插入到数据库中,然后从文件夹中删除文件。这里它的工作原理但是整个内容插入数据库中的一个字段的问题。 以下是代码:

   inotifywait -m /home/a/b/c -e create -e moved_to |
   while read path action file; do
     for filename in `ls -1 /home/a/b/c/*.txt`  
     do
        while read line
        do
           echo $filename $line
           mysql -uroot -p -Bse "use datatable; INSERT INTO 
           table_entries (file,data ) VALUES ('$filename','$line'); "
           done <$filename     
           done
       find /home/a/b/c -type f -name "*.txt" -delete
        done

基本上文件包含:姓名,地址,contact_no,电子邮件。 我想从文件中插入名称到数据库中的名称字段,地址中的地址。在php中我们使用explode来分割数据,我在shell脚本中使用了什么?

1 个答案:

答案 0 :(得分:1)

如果您使用LOAD DATA INFILE,这会容易得多(请参阅手册以获取语法和选项的完整说明)。

像这样的东西(虽然我没有测试过):

inotifywait -m /home/a/b/c -e create -e moved_to |
while read path action file; do
  for filename in `ls -1 /home/a/b/c/*.txt`  
  do
     mysql datatable -e "LOAD DATA LOCAL INFILE '$filename' 
       INTO TABLE table_entries (name, address, contact_no, email) 
       SET file='$filename'"
  done
  find /home/a/b/c -type f -name "*.txt" -delete
done

编辑:我指定了mysql datatable,就像使用USE datatable;来设置默认数据库一样。这应解决有关“未选择数据库”的错误。

列为(name, address, contact_no, email)的列命名表中的列,它们必须与输入文件中的列匹配。 如果表中有另一列要设置,而不是输入文件中的数据,则使用额外的子句SET file='$filename'

在删除* .txt文件之前,您还应该使用一些错误检查来确保导入成功。

请注意,LOAD DATA INFILE假定行以换行符(\n)结尾,并且字段由制表符(\t)分隔。如果文本文件使用逗号或其他分隔符,则可以向LOAD DATA INFILE语句添加语法,以自定义文件的读取方式。文档显示了如何执行此操作,并提供了许多示例:https://dev.mysql.com/doc/refman/5.7/en/load-data.html我建议您花一些时间阅读它。这真的不长。