Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Возникла необходимость занести данные из txt файла в таблицу БД MySQL.
Формат данных хранящихся в файле имеет следующий вид :
356837062;09.01.2008 10:29:59;"DSFD";"ETTT";"B";31.83;6;19098
356837063;09.01.2008 10:29:59;"EQBR";"YYRY";"S";31.83;9;28647
356837064;09.01.2008 10:29:59;"TTTY";"WERT";"B";31.83;35;111405
356837065;09.01.2008 10:29:59;"RYRY";"UITR";"B";31.83;465;1480095
356837066;09.01.2008 10:29:59;"YTRY";"OPUT";"S";31.83;168;534744
Подскажите , можно ли это сделать средствами MySQL ???
Или стоит писать программу для чтения строк из файла и последующего insert into ???
Неактивен
Неактивен
Респект за наводку.
Только вот у меня такая сложность . Текстовый файл содержит 10 полей , а таблица в которую будет производится загрузка - 7 . При этом порядок полей в файле не соответствует порядку следования полей в таблице .
Если я правильно понял из мануала , есть возможность выбрать поля таблицы которые можно загрузить , а как выбрать поля в файле которые хотелось бы получить посредством запроса ???
Или тупо создать дополнительные поля в таблице , для загрузки дополнительных ненужных полей из файла ???
Неактивен
You can also discard an input value by assigning it to a user variable and not assigning the variable to a table column:
Неактивен
Хм , это всё конечно хорошо , только вот у меня в таблице поле с значением TIME, а в файле TIMESTAMP .
Есть ли какие нибудь возможности для того чтобы из файла считывалась только часть , относящаяся к TIME ???
Или прийдётся как то извращаться , подскажите .
Неактивен
Те же действия, только потом еще обрезаете так, как Вам надо через SET.
Неактивен
Да спасибо , составил вот такой запрос :
LOAD DATA LOCAL INFILE "C:\\DATA_EXPORT\\data.txt"
INTO TABLE `dataauto`.`data_ticks`
FIELDS
TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES(id,@d,@dum,Symbol,Operation,price,vol,Turnover)
SET T=DATE_FORMAT(@d,'%H:%i:%s');
MySQL выдаёт сообщение об ошибке : ERROR 1048 (23000): Column 'T' cannot be null ???
Непонятки , когда закачивал в туже таблицу данные из файла ( где поле имело тип Time , такое же как и у меня в таблице ) без использования SET , таких ошибок не возникало .
Если я правильно понимаю в команде SET нельзя использовать такие функции , а как же быть тогда с конвертацией поля TIMESTAMP до TIME ???
Неактивен
попробуйте
SET T=IFNULL(DATE_FORMAT(@d,'%H:%i:%s'), now());
Неактивен
С использованием такого запроса ( SET T=IFNULL(DATE_FORMAT(@d,'%H:%i:%s'), now()) ) данные из файла загружаются . Но только вот now() портит всю малину , мне надо что бы данные TIME были такие же как и в txt файле ?!
Неактивен
now() срабатывает только в случае, когда на этом месте был бы NULL
Неактивен
" IFNULL(expr1,expr2)
Если expr1 не равно NULL, то функция IFNULL() возвращает значение expr1, в противном случае - expr2. "
Так вот и получается , что при загрузке данных в моей таблице появляется не те данные TIME из файла , а так же получаю предупреждение " Truncated incorrect datetime value: '19.11.2007 10:29:29' " - ( некоторое время назад протестировал и получил в поле T , в каждой строке , одинаковое значение 00:19:49 ).
???
Отредактированно Twix (18.02.2009 01:18:40)
Неактивен
SET T=SUBSTR(@d,-8);
Дата в MySQL передаётся в формате YYYY-MM-DD или YYYYMMDD.
Неактивен
Дата в файле ( из которого производится загрузка ) в MySQL имеет формат 19.11.2007 10:29:29 .
Отредактированно Twix (18.02.2009 10:49:23)
Неактивен
И я о том же. А должна YYYY-MM-DD HH:MM:SS, иначе ф-я DATE_FORMAT вас не поймёт или поймёт, но не правильно, поэтому нужно отрезать только часть HH:MM:SS
T=SUBSTR(@d,-8)
Неактивен
" SUBSTR(,X,Y) Извлекает Y символов из строки начиная с позиции X. "
Спасибо ОГРОМНОЕ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
С таким запросом SET T=SUBSTR(@d,-8) - всё стало на свои места , только вот поясните почему минус 8 - с какой точки начинаем отсчёт ???
Неактивен
substr
"It is also possible to use a negative value for pos. In this case, the beginning of the substring is pos characters from the end of the string, rather than the beginning."
Отрицательный pos - смещение вырезаемой подстроки от конца исходной строки, т.е. SUBSTR(@d,-8) = взять последние 8 символов строки.
Отредактированно coin (19.02.2009 00:39:30)
Неактивен
Не хотелось бы плодить новую тему, поэтому пишу здесь. Как загрузить в таблицу файл, если разделитель переменной длинны?
Запись типа такой:
1243856775.865[\s\s]38587[\s]10.2.1.26[\s]TCP_MISS/200[\s]370[\s]GET
где [\s...] - это я так показал группу пробелов, их может быть один или больше. Если использую terminated by ' ', то колонок получается больше чем нужно, естественно.
Неактивен
Выглядит как форматированный вывод; там точно не табуляции?
Насколько я знаю, у MySQL нет способа засасывать данные с переменным числом колонок
Но можно, например, пропустить через какой-нибудь тупой фильтр типа
cat file | perl -ne 's/\s+/ /g; print' > outfile
Неактивен
Нет, именно пробелы. Жаль, что нет такой фичи. А было бы неплохо, что-то типа регулярки terminate by '\s+'
У меня виндовый сервер - есть какие-нибудь аналоги этой команды по винду?
Я щас вообще доисторически делаю - гружу файл в ultraedit и Ctrl+R (заменой) меняю пробелы на один. Но это конечно не выход, да и не уверен я что UE справится с файлом в пару гигабайт (сейчас всего то 300M)
Неактивен
Разобрался. Для потомков сообщаю, что есть набор портированных под win юниксовых утилит, в том числе и cat - http://gnuwin32.sourceforge.net/packages/coreutils.htm . Дальше дело техники.
Паша, спасибо за наводку, ну и вообще
Неактивен
Классно, я думал под винду надо cygwin ставить целиком
Неактивен
Twix написал:
Да спасибо , составил вот такой запрос :
LOAD DATA LOCAL INFILE "C:\\DATA_EXPORT\\data.txt"
INTO TABLE `dataauto`.`data_ticks`
FIELDS
TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Часть обрезал, что для моей задачи не нужно.
Люди добрые подскажите, можно ли разделять строку по столбцам базы, если в разных строках разные разделители?
как составить запрос если у меня в текстовом файле строки имеют такой вид.
aaa:123
bbb;321
ccc[пробел]231
Неактивен
имхо, хорошего способа нет
можно:
1. загнать всё в базу, не разделяя, в доп столец
2. несколько update для каждого разделителя, которые будут резать строку и раскидывать по столбцам
3. удаление доп столбца
Неактивен
vasya написал:
имхо, хорошего способа нет
можно:
1. загнать всё в базу, не разделяя, в доп столец
2. несколько update для каждого разделителя, которые будут резать строку и раскидывать по столбцам
3. удаление доп столбца
1-й и 3-й пункт понятен, помогите примером как написать update
Есть таблица, в ней 3 столбца
a1, a2 и tmp
в tmp импортировал данные, как данные у которых разделитель ";" разделить между a1 и a2
Неактивен
Посмотрите примеры в этих темах:
http://sqlinfo.ru/forum/viewtopic.php?id=591
http://sqlinfo.ru/forum/viewtopic.php?id=2242
Неактивен
Страниц: 1