Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Массовый импорт CSV / 25 сообщений из 29, страница 1 из 2
21.05.2020, 11:43
    #39960241
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Доброго времени суток.

С MSSQL имею опыт общения давно, а вот буквально недавно заставили заниматься MySQL, и тут я полный нуб.

Возникла необходимость массового импорта кучи файлов (тысячи) в БД. Когда делаю так, все работает:

Код: sql
1.
2.
3.
4.
5.
6.
LOAD DATA INFILE 'путь/имя файла с пробелами.csv'
			INTO TABLE `таблица`
			character set CP1251
			FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '"' 
			LINES TERMINATED BY '\r\n'						
			IGNORE 1 LINES 



У меня есть список имен файлов, и когда я пытаюсь передать в качестве переменной "путь/имя файла с пробелами.csv"
получаю ошибку синтаксиса.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SET @a = 'имя файла с пробелами.csv';
-- SET @b = CONCAT('\'','путь',@a,'\''); -- не работает ни так
SET @b = CONCAT('"','путь',@a,'"');		-- ни так
			
--select @b;			
			
  			LOAD DATA INFILE @b
			INTO TABLE `таблица`
			character set CP1251
			FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '"' 
			LINES TERMINATED BY '\r\n'											 
			IGNORE 1 LINES



авторОтвет MySQL: Документация
#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '@b
INTO TABLE `таблица`
character set CP1251
FIELDS TERMINATED BY ';' ENCL' на строке 5

Как в эту конструкцию правильно передать путь и имя файла переменной. Спасибо!

З.Ы. c Declare и курсором еще разбираюсь...
...
Рейтинг: 0 / 0
21.05.2020, 11:46
    #39960244
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Имя файла - литерал, и подставляться не будет. Используйте PREPARE statement.
...
Рейтинг: 0 / 0
21.05.2020, 12:06
    #39960251
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000
кучи файлов
А их список откуда происходит?
Можно там же и нагенерить кучу команд LOAD DATA INFILE.
...
Рейтинг: 0 / 0
21.05.2020, 12:26
    #39960256
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000,

Лучше бы сконвертировал csv в sql инструкции и загнал так, кмк.
...
Рейтинг: 0 / 0
21.05.2020, 13:55
    #39960294
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
crutchmaster
f000,

Лучше бы сконвертировал csv в sql инструкции и загнал так, кмк.
А смысл? тратить время на конвертацию, а потом еще и загрузка будет медленнее идти.
...
Рейтинг: 0 / 0
21.05.2020, 14:23
    #39960303
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
crutchmaster
Лучше бы сконвертировал csv в sql инструкции и загнал так, кмк

Угу. Только не сами CSV в SQL, а их список - в набор SQL с инструкциями LOAD ...
...
Рейтинг: 0 / 0
21.05.2020, 14:24
    #39960304
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
А ещё лучше - дополнительно все CSV, заливаемые в одну таблицу, слить в один большой CSV.
...
Рейтинг: 0 / 0
21.05.2020, 14:44
    #39960307
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Akina
А ещё лучше - дополнительно все CSV, заливаемые в одну таблицу, слить в один большой CSV.
А вот тут пока непонятно, одинаковый ли у них формат и целевая таблица.
...
Рейтинг: 0 / 0
21.05.2020, 15:30
    #39960322
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
miksoft
Akina
А ещё лучше - дополнительно все CSV, заливаемые в одну таблицу, слить в один большой CSV.
А вот тут пока непонятно, одинаковый ли у них формат и целевая таблица.

да, формат одинаковый, таблица одна, но это первичный импорт, сейчас общий объем файлов около 1Гб и растет, после первичного наполнения планирую раз в неделю грузить, но там объемы будут гораздо меньше (10-20 Мб).

но я пока затупляю с курсором и PREPARE
...
Рейтинг: 0 / 0
21.05.2020, 16:22
    #39960336
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000
с курсором и PREPARE
Вот нафига? В каком формате список файлов-то? в таблице какой? или просто DIR /b > list.txt ?
...
Рейтинг: 0 / 0
21.05.2020, 16:52
    #39960351
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Akina
f000
с курсором и PREPARE
Вот нафига? В каком формате список файлов-то? в таблице какой? или просто DIR /b > list.txt ?


из list.txt я уже загнал в табличку list_f)

пока нарисовал такую процедуру, прям выдерал куски кода из манов:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
BEGIN
    
Declare vBankName VARCHAR(60);
Declare done integer default 0;
Declare BankCursor Cursor for SELECT `list` FROM `list_f`;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

Open BankCursor;

WHILE done = 0 DO
  FETCH BankCursor INTO vBankName;

		SET @s = "";
		
		SET @s = CONCAT('LOAD DATA INFILE ', '\'', 'путь', vBankName, '\'');
		
		SET @s = CONCAT(@s, '\n', 'INTO TABLE `3`');
		
		SET @s = CONCAT(@s,  '\n', 'character set CP1251');
		
		SET @s = CONCAT(@s,  '\n', 'FIELDS TERMINATED BY '';'' ENCLOSED BY ''"'' ESCAPED BY ''"''');
		
		SET @s = CONCAT(@s,  '\n', 'LINES TERMINATED BY ''\\r\\n''');
		
		SET @s = CONCAT(@s,  '\n', 'IGNORE 1 LINES');
	
		
		 	PREPARE stmt3 FROM @s;

			EXECUTE stmt3;

			DEALLOCATE PREPARE stmt3;
	
	
END WHILE;

Close BankCursor;
    
END



Но при выполнении получаю ошибку:
автор1295
ER_UNSUPPORTED_PS
This command is not supported in the prepared statement protocol yet
Данная команда еще не поддерживается в протоколе подготовленных операторов

Помогите допилить.
...
Рейтинг: 0 / 0
21.05.2020, 17:08
    #39960362
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000,

LOAD DATA INFILE кажись не поддерживается в PREPARE
https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
...
Рейтинг: 0 / 0
21.05.2020, 17:10
    #39960363
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000
из list.txt я уже загнал в табличку list_f)
Если изначально список файлов находится в шелле ОС, то, имхо, лучше там все и делать.
Либо запустить утилиту mysqlimport с каждым файлом, либо запустить один раз, но скормить ей список файлов.
...
Рейтинг: 0 / 0
21.05.2020, 17:13
    #39960367
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Alex_Ustinov
f000,

LOAD DATA INFILE кажись не поддерживается в PREPARE
https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html


приплыли...

и что делать?

З.Ы. PHP я еще хуже знаю )
...
Рейтинг: 0 / 0
21.05.2020, 17:14
    #39960369
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
miksoft
f000
из list.txt я уже загнал в табличку list_f)
Если изначально список файлов находится в шелле ОС, то, имхо, лучше там все и делать.
Либо запустить утилиту mysqlimport с каждым файлом, либо запустить один раз, но скормить ей список файлов.

пасиба, почитаю
...
Рейтинг: 0 / 0
21.05.2020, 17:22
    #39960375
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000,
авторЗ.Ы. PHP я еще хуже знаю если тащите из PHP, то там и готовьте запрос, зачем хранимка
...
Рейтинг: 0 / 0
21.05.2020, 18:47
    #39960420
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000
пасиба, почитаю
ОС какая?
...
Рейтинг: 0 / 0
21.05.2020, 20:58
    #39960475
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
f000
из list.txt я уже загнал в табличку list_f
Напрасно. Надо было прямо из него состряпать пачку LOAD DATA (да хоть в блокноте! хотя в, скажем, Экселе, проще), да скормить её клиенту командной строки как SOURCE.
...
Рейтинг: 0 / 0
22.05.2020, 04:18
    #39960536
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
miksoft
тратить время на конвертацию

Ты так и так делаешь конвертацию, просто в твоём случае она идёт через вложенку на mysql, которая не удобная, косая и работает хер пойми как. А написать ты можешь что хочешь и как хочешь.
а потом еще и загрузка будет медленнее идти.
Да не, загрузка шустро всегда шла, никаких проблем с этим не было. Конвертировал в sql инструкции, а потом потоком заливал в базу как-то так:
Код: sql
1.
cat load.sql | mysql --login <login> --password <password> --host <host>


Идеальный вариант, т.к. заливаются любые объёмы и с данными можно проводить любые манипуляции еще на этапе подготовки.
...
Рейтинг: 0 / 0
22.05.2020, 07:38
    #39960544
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
crutchmaster
Идеальный вариант
Вообще-то нет. Единственный плюс в загрузке именно дампа - это возможность комбинировать DDL, DML и административку в одном загружаемом файле. Кстати, LOAD DATA вполне может быть применено и в дампе.

crutchmaster
заливаются любые объёмы
А время заливки? LOAD DATA по скорости выигрывает, причём порой - аж в разы.

crutchmaster
с данными можно проводить любые манипуляции еще на этапе подготовки
А вот LOAD DATA позволяет делать нужные обработки даже в процессе импорта.

У LOAD DATA есть только один минус. Если в процессе импорта произойдёт какая ошибка (скажем, кривые данные, а обработка именно такого не предусмотрела, и в поле пихается в принципе несовместимое значение), то те данные, которые уже были загружены, останутся в таблице, тогда как при загрузке дампа всё (или вызвавший ошибку запрос, если не объявлена транзакция) откатится (между прочим, ахнув на это времени больше, чем потрачено на загрузку проблемным запросом или транзакцией до обнаружения ошибки).
...
Рейтинг: 0 / 0
22.05.2020, 08:19
    #39960551
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Akina
Вообще-то нет.

Там есть лимит на размер csv?
А csv обязательно надо тащить на сервак?
А если он большой?
А если много мелких?

Akina
А время заливки? LOAD DATA по скорости выигрывает, причём порой - аж в разы.

Ну, может и выиграет, если всё идеально с первого раза один csv метров на 100 и его не надо никуда тащить.
Как видишь у тс'а возникла проблема, потому что файлов много и он не может нормально подставить имя. Если бы он слил всё в один дамп, то вообще бы не парился, всё бы уже сделал и пошел пить чай. Вот и считай, что выгодно по времени.
...
Рейтинг: 0 / 0
22.05.2020, 09:39
    #39960577
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
crutchmaster
Если бы он слил всё в один дамп, то вообще бы не парился, всё бы уже сделал и пошел пить чай.
А если бы в дампе были не INSERT INTO, а LOAD INFILE - то ему бы чаю не налили?
crutchmaster
А csv обязательно надо тащить на сервак?
Ну почему? есть и LOAD LOCAL INFILE. Лишь бы файл доступен был с сервера.
...
Рейтинг: 0 / 0
22.05.2020, 09:54
    #39960581
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Akina
Ну почему? есть и LOAD LOCAL INFILE. Лишь бы файл доступен был с сервера.

Ну так его тащить тогда придётся на сервак в любом случае. Когда надо один раз руками - ну да, на постоянству какими-то скриптами - хз.

Хотя, нагенерить чем-нибудь sql, а потом скормить это всё серваку, для ТСа был бы вариант.
...
Рейтинг: 0 / 0
22.05.2020, 10:38
    #39960600
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
crutchmaster
Ну так его тащить тогда придётся на сервак в любом случае.
какая разница, тащить данные в виде CSV-файла или в виде SQL-файла? один хрен тащить...

crutchmaster
нагенерить чем-нибудь sql
А вот это запросто может стать определённой проблемой. Ибо в процессе запросто может потребоваться что-то квотить при помещении значений в строковые литералы. Например, CSV с кавычками и прочей дрянью в значениях - тот ещё головняк...
...
Рейтинг: 0 / 0
22.05.2020, 10:53
    #39960607
f000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массовый импорт CSV
Спасибо всем за быстрый отклик и дельные советы.

Запилил процедурку, может через одно место, но это работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
BEGIN
    
Declare vBankName VARCHAR(60);
Declare done integer default 0;

Declare BankCursor Cursor for SELECT `list` FROM `list_f`;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

Open BankCursor;

WHILE done = 0 DO
  FETCH BankCursor INTO vBankName;

	if ! done then

		SET @s = "";
	
		SET @s = CONCAT('LOAD DATA INFILE ', '\'', 'путь/', vBankName, '\'');
		
		SET @s = CONCAT(@s, '\n', 'INTO TABLE `3`');
		
		SET @s = CONCAT(@s,  '\n', 'character set CP1251');
		
		SET @s = CONCAT(@s,  '\n', 'FIELDS TERMINATED BY '';'' ENCLOSED BY ''"'' ESCAPED BY ''"''');
		
		SET @s = CONCAT(@s,  '\n', 'LINES TERMINATED BY ''\\r\\n''');
		
		SET @s = CONCAT(@s,  '\n', 'IGNORE 1 LINES;');
		
		SET @s = CONCAT(@s,  '\n');
	
			INSERT INTO String_Z (N) SELECT @s;
			
 	end if;
 	
END WHILE;

Close BankCursor;

 SELECT N FROM String_Z;
 
 SELECT N FROM String_Z INTO OUTFILE 'путь/query.txt'
 FIELDS ENCLOSED BY '' ESCAPED BY ''
 LINES TERMINATED BY '\n';
 
 TRUNCATE TABLE string_z;
    
END



Формирует текстовый файл с запросами по каждому файлу из списка.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Массовый импорт CSV / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]