1

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

以下是步骤:

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

我的问题如下:

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' 与 columns 数组的第一个位置相关联,反之亦然)。

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

编辑

我想我找到了问题 2 的答案。在解析 csv 文件时,我可以获得每条记录的计数,解析结束时的最高计数是我的计数。看起来对吗?有什么问题吗?

4

1 回答 1

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。

于 2013-01-25T01:08:33.830 回答