sed+LOAD DATA INFILE (Вопрос по Mysql)
Модераторы: SLEDopit, Модераторы разделов
-
aka
- Сообщения: 171
sed+LOAD DATA INFILE
Уважаемые, есть такой вопрос.Необходимо содержимое одного файла загнать в базу.Все в приницпе неплохо, поля разделены ; загружается вроде все корректно, Но так же загружает в базу и заголовки таблиц.Как сделать, что бы загружались только данные?В приницпе перерыв все по синтаксису данной команды нашел только ignore, и насколько я понял через него можно задать какую строку пропусть...и это не совсем то...
Мой блог -- unixway.info --
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
так удалите заголовки. прежде чем загружать.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
да. потому что «то» звучит иначе:
ignore <количество> lines
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
С удовольствием, но они повторяются довольно таки часто.Если натолкнете на мысль как автоматизировать процесс удаления, буду благодарен.
Ага, уже дошел до этого
Мой блог -- unixway.info --
-
Frank
- Сообщения: 1059
- ОС: Ubuntu, Debian
Re: sed+LOAD DATA INFILE
man sed
man awk
Мускулю вы никак не объясните чего вом надо, т.к. с его точки зрения, заголовки ничем не отличаются от остальных данных - те же буквы/цифры между разделителем.
man awk
Мускулю вы никак не объясните чего вом надо, т.к. с его точки зрения, заголовки ничем не отличаются от остальных данных - те же буквы/цифры между разделителем.

-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
Frank спасибо за совет.У меня еще есть последняя надежда
Может быть все таки эти заголовки как то выделены?Как можно проверить?Имеется ввиду какими знаками, которые не видны при чтении.
Мой блог -- unixway.info --
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
я смотрю hexdump-ом или даже просто в vim-е.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
sim1
- Сообщения: 155
- ОС: GNU,BSD
Re: sed+LOAD DATA INFILE
а вариант загрузить все с заголовками, а потом с помощью SQL выражений их удалить ?
Разработка программ для *nix
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
sim1
а разница в чём?
а разница в чём?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
sim1
- Сообщения: 155
- ОС: GNU,BSD
Re: sed+LOAD DATA INFILE
(aka @ May 8 2009, в 16:03) писал(а):С удовольствием, но они повторяются довольно таки часто.Если натолкнете на мысль как автоматизировать процесс удаления, буду благодарен.
В этом случае удалить заголовки можно:
1. Перед вставкой в базу с помощью sed, awk, как предложил Frank.
2. После того, как данные попали в базу c помощью SQL выражений(я);
Собственно разница в том, что один из вариантов убрать заголовки - удалить с помощью SQL выражений(я) после того, как данные попали в базу. Если в заголовках присутствует одинаковые данные то убить их всех можно одним выражением.
Разработка программ для *nix
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
sim1 писал(а): ↑08.05.2009 23:10(aka @ May 8 2009, в 16:03) писал(а):С удовольствием, но они повторяются довольно таки часто.Если натолкнете на мысль как автоматизировать процесс удаления, буду благодарен.
В этом случае удалить заголовки можно:
1. Перед вставкой в базу с помощью sed, awk, как предложил Frank.
2. После того, как данные попали в базу c помощью SQL выражений(я);
Собственно разница в том, что один из вариантов убрать заголовки - удалить с помощью SQL выражений(я) после того, как данные попали в базу. Если в заголовках присутствует одинаковые данные то убить их всех можно одним выражением.
Спасибо за советы.Думаю действительно загружать все в базу а потом запросами удалять сразу.Походу возник вопрос.Загружаю таким образом
Код: Выделить всё
LOAD DATA LOCAL INFILE '/home/user/calls/calls123.txt' INTO TABLE calls FIELDS TERMINATED BY ';'У меня есть несколько файлов, которые будут каждый месяц изменяться в названии.Как сделать загрузку примерно след образом?
Код: Выделить всё
LOAD DATA LOCAL INFILE '/home/user/calls/*' INTO TABLE calls FIELDS TERMINATED BY ';'Мой блог -- unixway.info --
-
IMB
- Сообщения: 2567
- ОС: Debian
Re: sed+LOAD DATA INFILE
Сложно как-то, http://dev.mysql.com/doc/refman/5.1/en/load-data.html . Обратите внимание на IGNORE.
Цикл на любом языке - shell, php и т.д.
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
IMB писал(а): ↑12.05.2009 19:33Сложно как-то, http://dev.mysql.com/doc/refman/5.1/en/load-data.html . Обратите внимание на IGNORE.
IGNORE однозначно не то, птму как структура файла не совсем четко структурирована.Поэтому решил все таки взяться за sed,и дошел до самого сложного.Постараюсь изложить.
Код: Выделить всё
пустая строка
число 1
пустая строка
данные;через;точку;с запятой
пустая трока
число 2
ДанныеСмысл заключается в том, что нужно выдергивать число 1 например, и вставлять его в начале каждой строки до след числа 2,ну или просто до следующей пустой строки.Есть идеи?Может, гуру по sedу найдется
Мой блог -- unixway.info --
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed+LOAD DATA INFILE
$
$ sed '' mysql.txt
123
x;y;z;t
343
a;b;c;d
12
a
$ sed -r '
/^$/b
/^[0-9]+$/ {h; b}
G
s/(.+)\n(.+)/\2 \1/
' mysql.txt
123
123 x;y;z;t
343
343 a;b;c;d
12
12 a
пустые строки я игнорирую. (/^$/b)
строки где только число я сохраняю в HS(/^[0-9]+$/ {h; b})
ну а перед всеми остальными я вставляю сохранённое число, и пробел
Код: Выделить всё
G#берём сохранённое число из HS
s/(.+)\n(.+)/\2 \1/#получается 2 строки: первая та что прочиталась, вторая -это число, ставлю сначала число(\2), затем пробел, а затем строку.вроде всё просто?
Спасибо сказали:
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
drBatty супер
Спасиб огромное.Если подскажите как же мне все таки удалить потом еще и эти число1,число2...
Почему то вот так не срабатывает вообще.
Крутил уже по разному!
Почему то вот так не срабатывает вообще.
Код: Выделить всё
sed -r '/^$/d
/^[67][0-9]+$/ {h; b}
G
s/(.+)\n(.+)/\2;\1/
s/^[67][0-9]*; //
s/^$[67][0-9]* // calls3.txt >call1234.txtКрутил уже по разному!
Мой блог -- unixway.info --
-
Frank
- Сообщения: 1059
- ОС: Ubuntu, Debian
Re: sed+LOAD DATA INFILE
Похоже, ты таки не прочитал man sed
Так же рекомендую почитать man regex
В кратце: третий и четвёртый sed у тебя удаляют только первую строку из цифр с точкой запятой и/или пробелом за ними.
В кратце: третий и четвёртый sed у тебя удаляют только первую строку из цифр с точкой запятой и/или пробелом за ними.

-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
замените «h;b» на «h;D». примерно так:
Код: Выделить всё
$ sed '/^$/b;/^[[:digit:]]\+$/{h;D};G;s/\(.*\)\n\(.*\)/\2 \1/' fileПисать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed+LOAD DATA INFILE
1) комментарии в sed пишутся за #
2)[67] - значит "либо символ 6, либо 7". Вы хотите 7 или 6 цифр?
тогда так: ^[0-9]{6,7}$
3)^ означает начало строки
4)$ конец строки
5) ^$ означает начало, и после него конец, ака "пустая строка"
жуть
это RE, классические регулярные. тут перед каждым(почти) метасимволом надо ставить \
И без того уродливые и непонятные RE, становятся совсем жуткими...
Я предпочитаю использовать ключ -r, и ERE.
Кроме того, конструкция [[:digit:]] может и труЪ, но имхо, [0-9] более ясно, и попроще.
sash-kan, спасибо. Хотя смысл вашего выражения для меня неясен, надо бы его переписать в человеческий вид...
вы знаете, дайте файл - "как было", и "что должно быть"
а то не слишком понял задачу...
а, понял...
ну вы и закрутили...
а почему не d? Я бы тут лучше бы написал перед b(которое вы заменили на D)
Код: Выделить всё
s/.*//Это было бы более правильное решение, особенно если дальше вы что-то менять будете...
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
дело вкуса и привычки.
привычка. слишком часто приходится использовать классы (man 7 regex).
в данном случае d и D взаимозаменяемы.
требуется же _удалить_ строку с номером, а не очистить её содержимое.
просто продемонстрировал немного иной синтаксис.
давайте будем более точными.
$ info sed Extended
шило на мыло, как говорится. в общем, дело привычки.The only difference between basic and extended regular expressions is in
the behavior of a few characters: `?', `+', parentheses, and braces
(`{}'). While basic regular expressions require these to be escaped if
you want them to behave as special characters, when using extended
regular expressions you must escape them if you want them _to match a
literal character_.
…
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed+LOAD DATA INFILE
конечно.
ясно... А что вы скажете на счёт \W \w? (и как там, [[:alnum:]])... И насчёт русского UTF-8?
Shell
$ sed -r 's/^\w{4}$/FOUND/
ффф
ффф
фффф
FOUND
У меня работает... Будет ли работать везде, где UTF-8 и русская локаль? Пугает то, что "фффф" это вообще-то 8 байт...
угу... d очищает буфер, D удаляет последнюю строку. В любом случае ничего не выводится. Беда в том, что логика работы нарушена... У меня 3 альтернативы, и выполняются 3 действия:
if(...)
{}
else if(...)
{}
else
{}
а вы мне последнее else убрали, впрочем - и так работает
я так подозреваю, что требуется только не пустые строки выводить, и без чисел.
тут бы надо ключ -n, и модификатор p, к команде замены...
Shell
$ sed -nr
/^$/b
/^[0-9]+$/ {h; b}
G
s/(.+)\n(.+)/\2 \1/p
' mysql.txt
123 x;y;z;t
343 a;b;c;d
343 eee;rt
12 a
вот так вот к примеру...
не буду спорить. длинна кода и степень понимания - субъективно. Я уже заметил, что многие ставят * там, где по логике должен быть +, потому-лишь, что + надо экранировать. Но думаю для новичка будет понятнее ERE, а это ценный новичёк, раз уже с sed разбирается, это не убунтовец уже 2 дня как, которого можно с чистой совестью послать на в гугл обратно в систему для домохозяек
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
разве я похож на Фридла? могу сказать только одно: \w и [:alnum:] — не совсем идентичные множества.
локаль-то тут причём? представление символа никак не зависит от того, с какого дня начинается рабочая неделя.
Код: Выделить всё
$ echo щ | LANG=C sed 's/^.$/1/'
щ
$ echo щ | LANG=en_US.utf8 sed 's/^.$/1/'
1накоторые классы — да, локалезависимы. но символы — они и в африке символы. сколько бы байт ни уходило на их представление.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
Прошу прощения,что "пропал":)Вообщем благодаря вашим советам у меня получилось таки то что нужно
Спасибо.Теперь бьюсь с переводом формата даты в этом же файле в мускульный вид.Пойду читать орейли "регулярные выражения":)
Мой блог -- unixway.info --
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
sash-kan писал(а): ↑19.05.2009 19:27а может, ничего переводить и не надо?
http://dev.mysql.com/doc/refman/5.1/en/datetime.html
Спасибо за ссылку.После прочтения задача упростилась.Теперь всего то нужно из dd.mm.yyyy сделать yyyy.mm.dd.Но все равно как то не дается.Будем дальше изучать тему
Мой блог -- unixway.info --
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed+LOAD DATA INFILE
Код: Выделить всё
s/([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})/\3.\2.\1/где-то была неплохая док про MySQL по русски, думаю, после её прочтения и этого будет не нужно
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
drBatty спасибище
Все работает,только очень хотелось бы понять как.Не распишите, эту строку?Буду,очень благодарен
здесь задаем любое совпадение 0-9 и указываем, что это совпадение может состоять из одной либо двух цифр,либо четрых {4} чисел,также указываем \. как разделители, но не вкидываем в буфер(потому как за скобками).
ну а тут просто меняем местами накопленное в буфере.
Правильно я все понял?
Код: Выделить всё
([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})Код: Выделить всё
/\3.\2.\1/Правильно я все понял?
Мой блог -- unixway.info --
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
Опять запнулся на таком вопросе.Есть структура
Не пойму как сдлеать так:
Не сочтите за наглость,но может все же кто подскажет,чуть
Всю голову уже сломал
Код: Выделить всё
;1
;2
;3
;4
;5
;1
;2
;3
;4
;5Не пойму как сдлеать так:
Код: Выделить всё
;1;2;3;4;5
;1;2;3;4;5Не сочтите за наглость,но может все же кто подскажет,чуть
Мой блог -- unixway.info --
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: sed+LOAD DATA INFILE
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: sed+LOAD DATA INFILE
у меня в профиле была чудная ссылочка на мой форум, там есть большая тема про sed...aka писал(а): ↑20.05.2009 12:55drBatty спасибищеВсе работает,только очень хотелось бы понять как.Не распишите, эту строку?Буду,очень благодарен
здесь задаем любое совпадение 0-9 и указываем, что это совпадение может состоять из одной либо двух цифр,либо четрых {4} чисел,также указываем \. как разделители, но не вкидываем в буфер(потому как за скобками).Код: Выделить всё
([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})
ну а тут просто меняем местами накопленное в буфере.Код: Выделить всё
/\3.\2.\1/
Правильно я все понял?
а здесь её указывать я не хочу - реклама..
Код: Выделить всё
([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})(одна или две цифры)
потом точка
(потом опять одна или 2 цифры)
потом точка
(потом ровно 4 цифры)
Первое то что в скобках \1, второе \2 ит.д.
\3\2\1
это 4 цифры, потом сразу 1или2 цифры(что по серёдке), потом первые 2 или одна...
s - команда замены, а не обмена или накопления...
она ничего не копит.
если у вас в буфере
12.3.4567
то после этой замены будет
4567.3.12
а если будет 12.3.456, то так и останется, просто команда не найдёт нужное.
не понятно...
ну так:
Shell
$ sed -r '/1/{N;N;N;N;s/\n//g}' st.txt
;1;2;3;4;5
;1;2;3;4;5
-
aka
- Сообщения: 171
Re: sed+LOAD DATA INFILE
Привел я все примерно к такому виду:
и так далее.
Мне необходимо Информацию о каждом человеке просто занести в одну строку,и удалить первую из повторяющихся строк по первыми двум значениям(но это потом наверное).
Вот примерно такая задача.Это уже почти финиш ломания головы с регулярными выражениями)Если опять невнятно сформулировал
,готов еще раз
)
Код: Выделить всё
;Иванов Иван
;7905627
;2009.31.01
;25.25
;Петров Петр Иванович
;7905362
;2009.31.01
;41.36и так далее.
Мне необходимо Информацию о каждом человеке просто занести в одну строку,и удалить первую из повторяющихся строк по первыми двум значениям(но это потом наверное).
Код: Выделить всё
;Иванов Иван;7905627;2009.31.01;25.25
;Петров Петр Иванович;7905362;2009.31.01;41.36(Если повторилась первую удалить)
;Петров Петр Иванович;7905362;2009.31.01;256.05Вот примерно такая задача.Это уже почти финиш ломания головы с регулярными выражениями)Если опять невнятно сформулировал
Мой блог -- unixway.info --