使用PDO加载具有特定列的csv文件

时间:2014-05-10 10:05:48

标签: php mysql csv

我有一个像这样的表结构:

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 个答案:

答案 0 :(得分:2)

正如LOAD DATA INFILE Syntax所述:

  

处理输入行时,LOAD DATA会将其拆分为字段,并根据列/变量列表和SET子句使用这些值(如果存在)。

换句话说,列列表应该描述应该为每个输入字段分配的数据库列(或用户变量)(而不是描述在哪个输入中)字段每个数据库列都可以找到)。当然,当人们意识到输入文件不需要包含字段名称时,这是显而易见的,因此在所有情况下都不可能采用后一种方法。

因此,您需要:

$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);

答案 1 :(得分:0)

您需要指定要使用的列(似乎您按照语句的执行顺序对它们进行了调整):

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';

请参阅manual for more details