如何提取分隔符前后的字符串并存储在mysql中?

tez616oj  于 2021-06-15  发布在  Mysql
关注(0)|答案(5)|浏览(394)

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

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

其中分隔符为“:”
“random”表示一组随机字符。
第一列中应该是字符串random1
在第二列中应存储字符串random2:random3:random4:randomn的其余部分
要提取第一列的子字符串,已尝试:

echo "random1:random2:random3:random4:randomN" | awk -F":" '{print (NF>1)? $1 : ""}'

echo "random1:random2:random3:random4:randomN" | sed 's/:.*//'

echo "random1:random2:random3:random4:randomN" | cut -d ":" -f1

如何从第一个分隔符“:”中提取子字符串直到行尾,并将其存储在mysql表中?
提前谢谢!

cbeh67ev

cbeh67ev1#

如果我们要调用mysql在一个表中插入大量的行。。。假设random1,random2,random3的“随机”特性排除了文本制表符 0x09 , '\t' ...
我不会在bash中解析文件,这是一个很大的开销。我只需要执行mysql客户机,然后发布一个mysql LOAD DATA 语句,并让mysql读取文件并对其进行解析。
例如
假设我们要将行插入到 mytablecol1 以及 col2 ,类似于:

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),'')

参考文献:https://dev.mysql.com/doc/refman/8.0/en/load-data.html
作为load data语句中所用表达式的演示:

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

退货

foo       foo1  foo2
--------  ----  -------
a         a     
:b              b
::c             :c
:::d            ::d
a:b       a     b
a:::d     a     ::d
a:b:c     a     b:c
a:b:c::e  a     b:c::e
camsedfj

camsedfj2#

在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;

请注意,这种技术要求您提前知道字符串中的最大部分数。

ej83mcc0

ej83mcc03#

你也可以试试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');
$
vm0i2vca

vm0i2vca4#

这会将第一个“:”更改为“,”以生成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
w80xi6nr

w80xi6nr5#

以下是解决方案的一部分(可能):

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

相关问题