我正在将CSV文件导入数据库,这是一个多步骤的过程。
以下是几个步骤:
John,Doe,jondoe@gmailcom,用户将从下拉框中选择firstname与数据值John相关联,从与数据值Doe关联的下拉框中选择lastname,从与数据值johndoe@gmail.com关联的下拉框中选择emailaddress我的问题如下:
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文件的解析中,我可以得到每个记录的计数,解析结束时最高的计数是我的计数。似乎是对的?有什么问题吗?
发布于 2013-01-25 01:08:33
要解析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。
https://stackoverflow.com/questions/14513639
复制相似问题