2015-11-30 65 views
1

我想在我的PHP腳本中創建一個CSV文件。它創建文件,但每次在最後插入一個空行。PHP - 創建CSV文件在結尾處插入空行

我的代碼如下:

$csv_output .= "Header 0,"; 
$csv_output .= "Header 1,"; 
$csv_output .= "Header 2,"; 
$csv_output .= "Header 3,"; 
$csv_output .= "Header 4,"; 
$csv_output .= "\r\n"; 

// db query... 

foreach($rows as $row): 

    if($row["value_3"] == 10) 
    { 
     $x = 'low'; 
    } 
    else if($row["value_3"] == 100) 
    { 
     $x = 'high'; 
    } 

    $csv_output .= "".$row["value_0"].","; 
    $csv_output .= "".$row["value_1"].","; 
    $csv_output .= "".$row["value_2"].","; 
    $csv_output .= "".$x.","; 
    $csv_output .= "Constant Always Value Goes here (not in db),"; 
    $csv_output .= "\r\n"; 
endforeach; 

$filename = "csv_".date("d-m-Y_H-i",time()); 
header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: csv" . date("Y-m-d") . ".csv"); 
header("Content-disposition: filename=".$filename.".csv"); 
print $csv_output; 

不管是什麼我的數據庫查詢或CSV多少行包含總是有一個最後的空行。有什麼引起這個?

+0

創建CSV文件的第一條規則......使用PHP內置的[fputcsv()](http://www.php.net/manual/en/function.fputcsv.php)函數... ..如果數據中有逗號(或其他分隔符),它不會中斷文件 –

+0

爲什麼在每個值之前使用這些空字符串('「」')?這是毫無意義的,無意義的開銷 –

+0

如果最後有空行,它很可能會在您的'print $ csv_output;'行後面添加___ –

回答

1

最後一個你可以直接寫CSV到輸出像這樣,你不需要它自己的格式。

// Send correctly formatted headers 
header("Content-type: application/vnd.ms-excel"); 

// Disposition should be "attachment" followed by optional filename. 
header(sprintf('Content-disposition: attachment; filename="csv_%s.csv"', date("d-m-Y_H-i"))); 

// Open a pointer to the output stream 
$fp = fopen('php://output', 'w'); 

// Build header array 
$head = array(
    "Header 0", 
    "Header 1", 
    "Header 2", 
    "Header 3" 
); 

// Write the header array in default csv row format. 
fputcsv($fp, $head); 

// db query... 

// Loop rows 
foreach($rows as $row) { 
    // Write the rows in default csv row format 
    fputcsv($fp, $row); 
} 

// Close the output stream 
fclose($fp); 

的另一個好處是它會使用較少的內存在大的下載,例如用PDO:

$stmt = $pdo->prepare("SELECT ..."); 
$stmt->execute(); 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    fputcsv($fp, $row); 
} 

這將輸出每一行到瀏覽器,直接從數據庫(或多或少) ,會佔用很少的內存。

+0

只有1件事,對不起,沒有把這個在我原來的問題(現在編輯)。在我的每一個循環內 - 我需要檢查值是什麼,並把文本放入csv而不是其中的一個值(參見編輯if($ row [「value_3」] == 10)...'還有,當我想把一個常量字符串放在那裏(請參見標題欄4),它不是從我的數據庫查詢中訪問的,但是對於每一行都是一個常量值,我怎麼用'fputcsv'來做這件事? –

+0

@odd_duck你可以在循環中修改'$ row'的元素,所以在最後添加一個列是:'$ row [] =「My Constant Value」'。 – Flosculus

0

除了Mark Ba​​ker強調的其他問題,您正在循環中添加EOL。刪除由trim

print trim($csv_output);