2012-06-06 31 views
1

我试图在PHP中将上传的CSV文件处理成数组。我工作得很好,但用户的一些文件最后有一堆带分隔符的空白行。当他们在现有文件上使用Excel时,通常会发生这种情况。突出显示旧的单元格并将其清除。空格上的PHP CSV文件停止

档案范例

 
lineNo,date,vendor,amount 
1,5/2/2012,V000236,3727.21 
2,5/2/2012,V003432,4826.19 
,,, 
,,, 

成为下阵列

Array 
(
    [0] => Array 
     (
      [0] => lineNo 
      [1] => date 
      [2] => vendor 
      [3] => amount 
     ) 

    [1] => Array 
     (
      [0] => 1 
      [1] => 5/2/2012 
      [2] => V000236 
      [3] => 3727.21 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => 5/2/2012 
      [2] => V003432 
      [3] => 4826.19 
     ) 

    [3] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
     ) 

    [4] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
     ) 
)

我不想只是删除任何空白行,我想停止2.转到容易对我的数组索引之后功能我是新:P

function csvToArray($csvFile, $specialChars = FALSE) { 
$arrayCSV = array(); 

if (($csvHandle = fopen($csvFile, "r")) !== FALSE) { // Open the CSV 
    $csvKey = 0; // Set the parent array key to 0 

    while (($csvData = fgetcsv($csvHandle)) !== FALSE) { 
     $c = count($csvData); // Count the total keys in each row 

     //need something to stop on blank delimiter rows ,,, 

     for ($x = 0; $x < $c; $x++) { //Populate the array 
      if ($specialChars === TRUE) { 
       $arrayCSV[$csvKey][$x] = htmlspecialchars($csvData[$x]); 
      } else { 
       $arrayCSV[$csvKey][$x] = $csvData[$x]; 
      } 
     } 
     $csvKey++; 
    } 

    fclose($csvHandle); 
} 

return $arrayCSV; 
} 

最后,我想这回

Array 
(
    [0] => Array 
     (
      [0] => lineNo 
      [1] => date 
      [2] => vendor 
      [3] => amount 
     ) 

    [1] => Array 
     (
      [0] => 1 
      [1] => 5/2/2012 
      [2] => V000236 
      [3] => 3727.21 
     ) 

    [2] => Array 
     (
      [0] => 2 
      [1] => 5/2/2012 
      [2] => V003432 
      [3] => 4826.19 
     ) 
)

回答

1

你能不能break; while循环,只要你找到一个空值?

if (($csvHandle = fopen($csvFile, "r")) !== FALSE) { // Open the CSV 
    $csvKey = 0; // Set the parent array key to 0 

    while (($csvData = fgetcsv($csvHandle)) !== FALSE) { 
     $c = count($csvData); // Count the total keys in each row 

     // ## Flag variable ########## 
     $empty = true; 

     for ($x = 0; $x < $c; $x++) { //Populate the array 

      // ## Test each value ########## 
      $empty = $empty && (empty($csvData[$x])); 

      if ($specialChars === TRUE) { 
       $arrayCSV[$csvKey][$x] = htmlspecialchars($csvData[$x]); 
      } else { 
       $arrayCSV[$csvKey][$x] = $csvData[$x]; 
      } 
     } 

     // ## Stop loop if all empty ########## 
     if ($empty) { 
      unset($arrayCSV[$csvKey]); 
      break; 
     } 
     $csvKey++; 

    } 

    fclose($csvHandle); 
} 
+0

在最后一个数组上添加了一个未设置,谢谢! – AugustLindholm

+0

@ user1439738很好,现在我明白了。感谢您的编辑;) –

1

注:

在CSV文件中的空白线将返回为包括单个字段的数组,并且将不被视为错误。

if ($c == 1 && current($csvData) === null) { 
     break; 
    }