Загрузите файл csv с определенными столбцами, используя PDO

У меня есть такая табличная структура:

id
assigned_by
assigned_to_user_id
vendor_id
receiver_no
purchase_order_no
destination
po_status
invoice_no
invoice_amount
delivery_date
datetime_done
latest_jda_sync_date
latest_mobile_sync_date
created_at
updated_at
deleted_at

И содержимое моего файла csv выглядит так:

vendor_id receiver_no purchase_order_no destination po_status
30105 20110 10151 9005 3
50015 20114 10155 9005 3

И сейчас я могу загрузить файл csv и вставить их в свою базу данных. У меня есть этот сценарий ниже.

$columns = "(@dummy, @dummy, @dummy, vendor_id, receiver_no, purchase_order_no, destination, po_status, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy, @dummy)";
$affectedRows = $pdo->exec("
 LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE '$databasetable'
 FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
 LINES TERMINATED BY ".$pdo->quote($lineseparator)." ". $columns);

Единственная проблема, с которой я столкнулась, - это вставить данные в правильный столбец. Может кто-нибудь мне помочь.

2 ответа

Как LOAD DATA INFILE разделе LOAD DATA INFILE Синтаксис:

При обработке входной строки <a href="http://dev.mysql.com/doc/en/load-data.html" rel="nofollow noreferrer" target="_blank"> <code>LOAD DATA</code></a> разделяет ее на поля и использует значения в соответствии с списком столбцов/переменных и предложением <code>SET</code>, если они присутствуют.

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

Поэтому вы хотите:

$columns = '(vendor_id, receiver_no, purchase_order_no, destination, po_status)';

Вам также нужно будет добавить IGNORE 1 LINES в команду, чтобы пропустить первую строку (с именами полей):

$affectedRows = $pdo->exec("
 LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE '$databasetable'
 FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
 LINES TERMINATED BY ".$pdo->quote($lineseparator)."
 IGNORE 1 LINES ". $columns);


Вам нужно указать, какие столбцы вы хотите использовать (кажется, вы их обманули в порядке выполнения вашего заявления):

LOAD DATA INFILE 'file.csv'
 INTO TABLE t1
 (column1, @dummy, column2, @dummy, column3, ...)
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';

Подробнее см. В руководстве.

licensed under cc by-sa 3.0 with attribution.