PHP CSV导入问题

时间:2013-01-25 00:56:39

标签: php mysql sql csv

我正在将CSV文件导入数据库,这是一个多步骤的过程。

以下是步骤:

  • 第1步:用户上传CSV文件。
  • 步骤2:用户将数据与数据类型相关联。例如,如果CSV中的记录包含以下数据:John,Doe,jondoe@gmailcom,则用户将从下拉框中选择firstname,以从与数据值Doe关联的下拉框中的数据值John,lastname关联,和来自与数据值johndoe@gmail.com
  • 关联的下拉框中的emailaddress
  • 第3步:将数据插入数据库

我的问题如下:

1. /在第3步,我将拥有用户选择的列和原始数据。

这是原始数据的样子:

$data = array(
 0 => array('John','Doe','johndoe@gmail.com'),
 1 => array('Foo','Bar','foobar@gmail.com')
);

以下是从第2步中选择的列:

$columns = array('firstname','lastname','emailaddress')

如何创建一个类似于以下内容的SQL查询:

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','johndoe@gmailcom')

正如您所看到的,SQL查询的列按照它们在数组中的顺序选择,然后是值。我在想,既然按照数据的顺序选择了列,我可以假设数据的顺序正确并且与该位置的特定列相关联(例如,我可以假设数据值' John'与列数组的第一个位置相关联,反之亦然。)

2. /我正在考虑一种可能的情况,即当用户进行文件的初始上载时,他们可能会发送一个csv文件,其中第一个记录具有空白字段。问题是,我根据csv记录中的列数确定用户与数据关联的列数。在这种情况下,我们有2列,每个后续记录有3列。好吧,我不会遍历整个记录集来确定正确的列数。我该如何解决这个问题?有什么想法吗?

修改

我想我找到了问题2的答案。在解析csv文件时,我可以得到每个记录的计数,并且解析结束时的最高计数是我的计数。好像对吗?有什么问题吗?

1 个答案:

答案 0 :(得分:1)

要解析CSV文件中的数据,请查看fgetcsv。 http://php.net/manual/en/function.fgetcsv.php

它将从文件加载一行并返回CSV字段的数组。

$data = array();
while (($lineFields = fgetcsv($handle)) !== false) {
    $data[] = $lineFields;
}

这假设您使用PHP5并使用$ handle打开文件。在PHP4中,fgetcsv需要第二个参数来读取最大行长度。

对于查询:

$sql = "INSERT into contacts (id," + implode(',', $columns) + ") values";

我没有在值之后包含任何内容。您应该创建预准备语句以防止sql注入。此外,如果您使用MySQL,id应该是一个自动增量字段,并从插入中省略(让MySQL生成它)。如果您使用Postgres,则需要为id字段创建序列。在任何情况下,让数据库为您生成id。