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

С 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
Массовый импорт CSV
    #39960244
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя файла - литерал, и подставляться не будет. Используйте PREPARE statement.
...
Рейтинг: 0 / 0
Массовый импорт CSV
    #39960251
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f000
кучи файлов
А их список откуда происходит?
Можно там же и нагенерить кучу команд LOAD DATA INFILE.
...
Рейтинг: 0 / 0
Массовый импорт CSV
    #39960256
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f000,

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

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

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

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

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

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

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


приплыли...

и что делать?

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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