如何在定界符前后提取字符串并存储在mysql中?

时间:2019-01-07 22:09:41

标签: mysql bash awk grep cut

想在具有两列的mysql表中插入一个txt文件,其中包含以下结构的大量行:

   def isPrimeUntil(t: Int): Boolean = t == 1 || t > 1 && n%t != 0 && isPrimeUntil(t-1)

定界符为“:”

“随机”代表一组随机字符。

第一列应为字符串random1

应在第二列中存储其余字符串random2:random3:random4:randomN

要提取第一列的子字符串,已经尝试过:

random1:random2:random3:random4
random1:random2:random3:random4:random5
random1:random2
random1:random2:random3:random4:randomN
...

如何从第一个定界符“:”提取子字符串直到行的末尾并将其存储在mysql表中?

提前谢谢!

5 个答案:

答案 0 :(得分:3)

(可能)这是您解决方案的一部分:

while IFS=: read -r first rest; do
    do_something_with "$first" "$rest"
done < colon-separated-file.txt

答案 1 :(得分:1)

这会将第一个“:”更改为“,”以制作CSV文件:

sed -E "s/([^:]*):/\1,/" myfile.txt > myfile.csv

然后您可以将其导入到表中。

或者,您可以创建一个SQL脚本:

sed -E "s/([^:]*):(.*)/insert into mytable (col1, col2) values ('\1','\2');/" myfile.txt > myfile.sql

然后运行它:

mysql -u root mydatabase -s < myfile.sql

答案 2 :(得分:0)

在MySQL中,您可以按照以下步骤用:分隔符分割字符串:

SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(mycolumn, ':', 1), ':', -1) as random1,
    SUBSTRING_INDEX(SUBSTRING_INDEX(mycolumn, ':', 2), ':', -1) as random1,
    ...
    SUBSTRING_INDEX(SUBSTRING_INDEX(mycolumn, ':', N), ':', -1) as random1,
FROM myTable;

请注意,此技术要求您事先知道字符串中的最大部分数。

答案 3 :(得分:0)

如果我们要调用MySQL将大量行插入到表中...假设random1,random2具有“随机”性质,random3会排除文字制表符0x09'\t'。 ..

我不会用bash解析文件,这会产生很多开销。我只执行mysql客户端,然后发出MySQL LOAD DATA语句,然后让MySQL读取并解析文件。

例如

假设我们要在mytablecol1的{​​{1}}列中插入行,就像这样:

col2

参考:https://dev.mysql.com/doc/refman/8.0/en/load-data.html


作为LOAD DATA语句中使用的表达式的演示:

LOAD DATA LOCAL INFILE '/tmp/foo.txt'
INTO mytable 
( @foo
)
SET col1 = SUBSTRING_INDEX(@foo,':',1)
  , col2 = IF(LOCATE(':',@foo)>0,SUBSTRING(@foo,LOCATE(':',@foo)+1,10000),'')

返回

SELECT t.foo
     , SUBSTRING_INDEX(t.foo,':',1) AS foo1
     , IF(LOCATE(':',t.foo)>0,SUBSTRING(t.foo,LOCATE(':',t.foo)+1,10000),'') AS foo2
 FROM ( SELECT 'a' AS foo 
        UNION ALL SELECT ':b'
        UNION ALL SELECT '::c'
        UNION ALL SELECT ':::d'
        UNION ALL SELECT 'a:b'
        UNION ALL SELECT 'a:::d'        
        UNION ALL SELECT 'a:b:c'        
        UNION ALL SELECT 'a:b:c::e'
      )  t

答案 4 :(得分:0)

您也可以尝试Perl

$ cat carlos.txt
random1:random2:random3:random4
random1:random2:random3:random4:random5
random1:random2
random1:random2:random3:random4:randomN
$ perl -F: -lane ' print "insert into mytable (col1, col2) values (\x27",$F[0],"\x27,\x27",join(":",@F[1..$#F]),"\x27);" ' carlos.txt
insert into mytable (col1, col2) values ('random1','random2:random3:random4');
insert into mytable (col1, col2) values ('random1','random2:random3:random4:random5');
insert into mytable (col1, col2) values ('random1','random2');
insert into mytable (col1, col2) values ('random1','random2:random3:random4:randomN');
$