Я использую оператор «load data infile» для загрузки нескольких файлов .csv в одну таблицу с помощью цикла foreach. Это работает, только у меня есть одна проблема. Столбцы в .csv не совпадают. Например, у меня есть это:
CSV1:
Идентификатор, имя, ЕАН, описание
CSV2:
Идентификатор, имя, образ, ЕАН, описание
И моя таблица MySQL:
Идентификатор, имя, ЕАН, описание
Так как я хочу импортировать несколько CSV через цикл, у меня проблема с CSV2 из-за столбца изображения. Если возможно, я хочу сопоставить имя столбца CSV с именем столбца таблицы. Таким образом, в этом примере [изображение] не импортируется. Я могу использовать переменную @ignore, но поскольку каждый .csv отличается, это не работает. У меня есть это:
$sql = "LOAD DATA LOCAL INFILE '$value[path]'
INTO TABLE db1.shoptest
FIELDS TERMINATED BY '$value[seperator]'
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
(id, name, ean, description)
;";
Можно ли сопоставить имена столбцов csv с именами столбцов таблицы и пропустить все остальные столбцы в .csv?
Большое спасибо за помощь мне!
С уважением,
отметка
Я думаю, что понял вопрос. Вы не хотите получать заголовки столбцов из первой строки CSV, а затем строите строку для использования в качестве col_name_or_user_var
аргумент LOAD DATA и используйте @ignore переменные назначения по мере необходимости.
id, name, state, ean, favorite_color, description
становится …
(id, name, @bunk, ean, @bunk, description)
$whiteList = ['id', 'name', 'ean', 'description'];
$columnHeader = 'id, name, state, ean, favorite_color, description';
$columnHeader = explode(',', $s);
foreach ($columnHeader as $k => $v) {
if (! in_array(trim($v), $whiteList)) $columnHeader[$k] = '@bunk';
}
echo implode(',', $columnHeaders);
Других решений пока нет …