wyjściowe do pliku CSV z '"' obudów

2013-06-06 19 views
7

Chcę wyjście kwerendy do pliku csv z " obudów wokół wszystkich dziedzinachwyjściowe do pliku CSV z '"' obudów

Poniższy.

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, ",", '"'); 

Wyjścia to:

FH, "GOTOWY DO ZAPŁATY", RTP060620134,060620134RWKN

ale Muszę go mieć:

"FH", "gotowy zapłacić", "RTP060620134", "060620134RWKN"

pomysłów, dlaczego to nie jest dodawanie obudów do pól 1, 3 & 4?

+0

ma takiej opcji w php ... ale patrz http: // stackoverflow.com/questions/2514597/php-fputcsv-and-enclosing-fields daje alternatywną implementację. – Orangepill

+2

Nie ma potrzeby, ponieważ nie zawiera znaków takich jak spacje, cudzysłowy czy znak separujący. – Gumbo

Odpowiedz

1

fputcsv jest dość sprytny w zgadywaniu, które kolumny muszą mieć nawiasy klamrowe, a nie w celu zachowania ważności pliku CSV.

W tej chwili wyświetla prawidłowy plik CSV.

fputcsv nie oferuje opcji wymuszania załączania w cudzysłowach, więc dobrze byłoby wiedzieć, dlaczego są one potrzebne w cudzysłowach.

+0

to plik podajnika do zaimportowania do Oracle (który jest bardzo specyficzny dla jakich pól oczekuje notowań). Domyślam się, że to nie jest prawdziwy plik CSV w tym przypadku, ale czy jest jakaś inna opcja? – Dion

0

Komentarz Gumby jest poprawny - jeśli nie ma potrzeby umieszczania w cudzysłowach, nie będzie. Możesz zrobić coś takiego, jak ustawić obudowę na pusty ciąg i umieścić je na sobie:

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

Dziękuję wszystkim za pomoc. Użyłem kombinacji odpowiedzi, ponieważ musiałem mieć możliwość wyboru, które pola należy zamknąć, a które nie. Dodałem unikalny ciąg znaków (XXX) wokół pól, które nie chcesz dołączyć i za pomocą str_replace przed napisaniem linię do pliku:

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); 
Powiązane problemy