2013-01-25 217 views
1

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

步骤如下:

  • 步骤1:用户上传CSV文件。
  • 第2步:用户将数据关联到数据类型。例如,如果CSV中的记录包含以下数据:John,Doe,[email protected],则用户将从下拉框中选择名字以与数据值John关联,与关联到数据值Doe的下拉框关联的姓氏以及来自某个数据值的电子邮件地址下拉框,联营的数据值[email protected]
  • 步骤3:将数据插入数据库

我的问题有以下几点:

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

这里是原来的数据是这样的:

$data = array(
0 => array('John','Doe','[email protected]'), 
1 => array('Foo','Bar','[email protected]') 
); 

这里就是我的列从第2步选择的样子:

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

如何创建一个SQL查询,可像下面这样:

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','[email protected]')

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

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

编辑

我想我找到了答案回答问题2 CSV文件的解析,我可以为每个记录,并在解析结束最高计数的计数是我的计数。好像?有什么问题呢?

+1

我没有谈及你的第二个问题,但你的解决方案是我想要的。伪代码:如果numFieldsCurrLine> maxFieldsSeen,则maxFieldsSeen = numFieldsCurrLine; –

回答

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。

+0

感谢您的回答和评论。正是我所期待的。 – jkushner