Как извлечь строки до и после разделителя и сохранить в mysql? - PullRequest
0 голосов
/ 08 января 2019

Хотите вставить в таблицу mysql с двумя столбцами текстовый файл с тоннами строк, содержащий следующую структуру:

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?

Заранее спасибо!

Ответы [ 5 ]

0 голосов
/ 08 января 2019

Вы также можете попробовать 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');
$
0 голосов
/ 08 января 2019

Если мы собираемся вызвать MySQL, чтобы вставить тонны строк в таблицу ... предполагая, что "случайный" характер random1, random2, random3 исключает буквальный символ табуляции 0x09, '\t' ...

Я бы не стал заниматься парсингом файла в bash, это много накладных расходов. Я бы просто запустил клиент mysql, выполнил оператор MySQL LOAD DATA и позволил MySQL прочитать файл и разобрать его.

, например

при условии, что мы хотим вставить строки в mytable столбцы col1 и 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
0 голосов
/ 08 января 2019

Вот часть вашего решения (возможно):

while IFS=: read -r first rest; do
    do_something_with "$first" "$rest"
done < colon-separated-file.txt
0 голосов
/ 08 января 2019

Это изменит первое ":" на ",", чтобы сделать файл 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
0 голосов
/ 08 января 2019

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

Обратите внимание, что этот метод требует, чтобы вы заранее знали максимальное количество частей в строке.

...