2016-04-24 127 views
1

我正在使用PHP函数fgetcsv()从csv文件读取。 csv文件的结构是这样的,第一行包含我想要导入的数据,而不是列标题。我想从第一行导入,但我注意到第一行被忽略。为什么fgetcsv跳过第一行?

如果我将第一行留空,则相同的行为仍然存在。只有当我在第一行的单元格中添加一些虚拟数据时,包含我想要导入的数据的第二行实际上会被导入,并且之后的所有其他行都会按照预期导入。

<?php 
$handle = fopen($_FILES['materials']['tmp_name'], "r"); 
$data = fgetcsv($handle, 1000, ","); 

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    if($this->checkMaterialsDuplicate($data[3]) != false) { 
     Session::setSession('import_failure', 'The Materials for TX '. 
      $this->_tx_no.' have already been added.'); 
     Helper::redirect('?section=store&subsection=import_design&page=import_design'); 
    } 
    echo "<pre>";print_r($data);echo "</pre>";exit; 
    $this->_fields[] = 'implicit_qty_of_fittings'; 
    $this->_values[] = $this->db->escape($data[1]); 

    $this->_fields[] = 'qty_of_desired_materials'; 
    $this->_values[] = $this->db->escape($data[2]); 

    $this->_fields[] = 'tx_no'; 
    $this->_values[] = $this->db->escape($data[3]); 

    $this->_fields[] = 'contractor_name'; 
    $this->_values[] = $this->db->escape($data[4]); 

    $this->_fields[] = 'contractor_id'; 
    $this->_values[] = $this->db->escape($data[5]); 

    $this->_fields[] = 'issue_date'; 
    $this->_values[] = $this->db->escape($data[6]); 

    $this->_fields[] = 'due_date'; 
    $this->_values[] = $this->db->escape($data[7]); 

    $this->_fields[] = 'fitting_id'; 
    $this->_values[] = $this->db->escape($data[8]); 

    $this->_fields[] = 'qty_multiplied_fittings'; 
    $this->_values[] = $this->db->escape($data[9]); 

    $this->_fields[] = 'imported'; 
    $this->_values[] = 1; 

    $sql = "INSERT INTO `{$this->_table_6}` (`"; 
    $sql .= implode("`, `", $this->_fields); 
    $sql .= "`) VALUES ('"; 
    $sql .= implode("', '", $this->_values); 
    $sql .= "')"; 

    if (!$this->db->query($sql)) { 
     $error[] = $sql; 
    } 

    $this->_subcontractor_name = $data[4]; 
    $this->_subcontractor_id = $data[5]; 
    unset($this->_fields); 
    unset($this->_values); 
} 

链接到示例CSV here

+0

有没有这样的选择跳过第一行中的文件,通常开发商手动添加此行为。你可以添加你的文件头(5-10行),所以我们可以尝试重现你的问题 –

+0

嘿,亚历山大这里是一个示例文件的链接http://s000.tinyupload.com/download.php?file_id=89300381502885483382&t = 8930038150288548338292456 – andromeda

+0

如您所见,第一行中的第一列值为553,但是当导入时,以值554开头的行是首先使用print_r()打印出的$ data变量 – andromeda

回答

5

你得fgetcsv一个额外的()调用的循环开始前 - 这将获取的第一行,然后将其丢弃,这意味着循环将启动在第二排。

只是删除这条线,它应该工作正常

$data = fgetcsv($handle, 1000, ",");