mysql将多行导入为单个记录

时间:2016-02-27 18:18:38

标签: mysql bash

昨天将此发布给Reddit,但没有爱。我在Centos上,编写bash脚本并解析数据以导入到mysql中。

我不得不将存储故事主要部分的故事档案转换为纯文本文件,并且需要能够将这些多行文本文件导入我的数据库中的列。我知道我可以使用mysqlimport,并且我将文件指定为管道分隔 - 但是因为我导入的文本文件中有回车符/换行符,所以它将每个段落作为自己的行导入。因此,当我使用mysqlimport时,9段文本文件将导入为9行。

有办法做到这一点吗?

我知道导入的理想文本文件(使用管道分隔符)就像(没有空白行):

  

这是我的记录| 12345

     

另一条记录| 24353

     有另一个百吉饼,为什么不呢?| 43253

但是,我的文件实际上更接近于此:

  

这是我第一段的第一行。现在我要做更多的换行和填充。

     

这是来自同一文本文件的第二行,应该将其视为单个记录以及单个“blob”或文本字段中的第一行。 | 12345

这是从有人丢弃的软件中恢复的最后一块绊脚石,我希望能够做到这一点。我有14,000个这样的文本文件(每个都是这种格式),所以手工完成它们是不可能的。

2 个答案:

答案 0 :(得分:0)

将新行编码/传输为'\ n',并将相同方式选项卡编码为'\ t'。当您将任何URL或原始文本存储到数据库中时,这是最佳做法。这也可以帮助你避免sql注入并解决你当前的问题......

如果有帮助,请告诉我。感谢。

答案 1 :(得分:0)

将行转换为sql语句时,我不知道性能。我认为它很有用:

输入

This is the first line of my first paragraph. And now I'm going to do some more line wrapping and stuff.

This is a second line from the same text file that should be treated as a single record along with the first line in a single "blob" or text field. |12345                                                                    
I am hoping I understood the question correct.                                                                 
Everything without a pipe is part of the first field.                                                          
And the line with a pipe is for field 1 and 2.                                                                 
Like this one |12346

脚本

my_insert="INSERT INTO my_table                                                                                
     (field1, field2)                                                                                          
     VALUES                                                                                                    
     ('"                                                                                                       

   firstline=0    
   while read -r line; do
      if [[ -z "${line}" ]]; then
         printf "\n"             
         continue;               
      fi                         
      if [[ "${firstline}" -eq 0 ]]; then
         printf "%s" "${my_insert}"      
         firstline=1                     
      fi                                 
      line_no_pipe=${line%|*}            
      if [[ "${line}" = "${line_no_pipe}" ]]; then
         printf "%s\n" "${line}"                  
      else                                        
         printf "%s',%s);\n" "${line_no_pipe}" "${line##*|}"
         firstline=0                                        
      fi                                                    
   done < input                                             

输出

INSERT INTO my_table
     (field1, field2)
     VALUES
     ('This is the first line of my first paragraph. And now I'm going to do some more line wrapping and stuff.

This is a second line from the same text file that should be treated as a single record along with the first line in a single "blob" or text field. ',12345);
INSERT INTO my_table
     (field1, field2)
     VALUES
     ('I am hoping I understood the question correct.
Everything without a pipe is part of the first field.
And the line with a pipe is for field 1 and 2.
Like this one ',12346);