2013-06-06 28 views
7

Tôi muốn đầu ra một truy vấn vào một tập tin csv với " rào xung quanh tất cả các lĩnh vựcOutput để CSV với '"' thùng

Sau đây:.

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename='.$strFeederFileName.''); 

$output = fopen('php://output', 'r+'); 
$fileheader = array("FH", "READY TO PAY", "RTP060620134", "060620134RWKN", ""); 
fputcsv($output, $fileheader, ",", '"'); 

Đầu ra này:

FH, "S READN SÀNG ĐỂ THANH TOÁN", RTP060620134,060620134RWKN

nhưng Tôi cần nó để được:

"FH", "sẵn sàng trả tiền", "RTP060620134", "060620134RWKN"

Bất cứ ý tưởng tại sao nó không thêm thùng để lĩnh vực 1, 3 & 4?

+0

Không có tùy chọn như vậy trong php ... nhưng xem http: // stackoverflow.com/questions/2514597/php-fputcsv-and-enclosing-fields để cung cấp cho bạn một triển khai thay thế. – Orangepill

+2

Không cần thiết vì nó không chứa các ký tự như khoảng trắng, dấu ngoặc kép hoặc ký tự tách. – Gumbo

Trả lời

1

fputcsv khá thông minh khi đoán cột nào cần có dấu ngoặc và không để giữ cho CSV hợp lệ.

Hiện tại, nó xuất CSV hợp lệ.

fputcsv không cung cấp tùy chọn buộc đưa vào dấu ngoặc kép, có lẽ bạn nên biết lý do tại sao bạn cần tất cả chúng trong dấu ngoặc kép?

+0

là một tệp trung chuyển để nhập vào Oracle (rất cụ thể về các trường mà nó đang chờ báo giá xung quanh). Tôi đoán nó không phải là một tập tin csv chính hãng trong trường hợp đó, nhưng là có bất kỳ tùy chọn khác? – Dion

0

Nhận xét của Gumby là chính xác - nếu nó không cần đính kèm trong dấu ngoặc kép, nó sẽ không. Bạn có thể làm một cái gì đó như đặt bao vây thành một chuỗi rỗng và đặt chúng vào chính mình:

$fileheader = array("FH", "READY TO PAY", "RTP060620134", "060620134RWKN", ""); 
for($i=0; $i<count($fileheader); $i++) 
{ 
    $fileheader[i] = '"' . $fileheader[$i] . '"'; 
} 
fputcsv($output, $fileheader, ",", ''); 
0

Cảm ơn sự giúp đỡ của bạn. Tôi đã sử dụng kết hợp các câu trả lời bởi vì tôi cần để có thể chọn trường nào để kèm theo và cái nào không. Tôi đã thêm một chuỗi duy nhất (xxx) xung quanh các trường mà tôi không muốn đính kèm và sử dụng str_replace trước khi ghi dòng vào tệp:

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename='.$strFeederFileName.''); 

function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep) 
{ 
dumbescape(false, $enclosure); 
$data_array=array_map('dumbescape',$data_array); 

$line = $enclosure 
    . implode($enclosure . $field_sep . $enclosure, $data_array) 
    . $enclosure . $record_sep; 

$line = str_replace('"xxx', '', $line); 
$line = str_replace('xxx"', '', $line); 

return $line; 
} 

function dumbescape($in, $enclosure=false) 
    { 
    static $enc; 
    if ($enclosure===false) { 
    return str_replace($enc, '\\' . $enc, $in); 
    } 
    $enc=$enclosure; 
} 

$output = fopen('php://output', 'r+'); 
$rows_csv = mysql_query('SELECT * FROM tblfeeder'); 

//Add file header 
$fileheader = array("FH", "READY TO PAY", $fileheader, $strOracleBatchName); 
$line = dumbcsv($output, $fileheader, "\"", ",", "\r\n"); 
fwrite($output, $line); 

// loop over the rows, outputting them 
while ($row_csv = mysql_fetch_assoc($rows_csv)) fwrite($output, dumbcsv($output, $row_csv, "\"", ",", "\r\n")); 

//Add file footer 
$filefooter = array("IF", "xxx".$batchtotal."xxx", "xxx".$invnum."xxx"); 
$line = dumbcsv($output, $filefooter, "\"", ",", "\r\n"); 
fwrite($output, $line);