Оберните CSV-значения, сгенерированные PHP fputcsv(), с помощью ""

Итак, мой код генерирует CSV файл, используя встроенную функцию fputcsv.

Для разделителя я использую ',' (запятая).
Для оболочки я использую '"' (двойная кавычка).

Однако, когда я пытаюсь что-то вроде

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"');

выводит

a,b,"long string, with commas",,

но я хотел бы, чтобы он выводил

"a","b","long string, with commas","",""

Есть ли простой способ справиться с этим, или мне пришлось бы написать замену для fputcsv?

Ответ 1

Обычно это не проблема для файлов CSV.

fputcsv ставит кавычки вокруг значения, если он будет неоднозначным. Например,

a,b,"long string, with commas",,

не является двусмысленным, но

a,b,long string, with commas,,

есть и будет в большинстве случаев (чтение: все) интерпретироваться читателем CSV как имеющее более 5 полей.

Анализаторы CSV будут принимать строковые литералы даже без кавычек вокруг них.

Если вам все равно нужны котировки вокруг значений, следующий сниппет будет делать это. Он не избегает кавычек внутри строки - это упражнение остается читателю:

$row = '"' . implode('", "', $rowitems) . '"';

Вы хотите поместить это в цикл для всех своих строк.

Ответ 2

Я работал над этим, вставив некоторые фиктивные строковые символы с пробелом # @@#, а затем удалив их. Вот пример реализации:

//$exported is our array of data to export
$filename = 'myfile.csv';
$fp = fopen($filename, 'w');
foreach ($exported as $line => $row) {
    if ($line > 0) {
        foreach ($row as $key => $value) {
                $row[$key] = $value."#@ @#";
        }
    }
    fputcsv($fp, $row);
}

fclose($fp);
$contents = file_get_contents($filename);
$contents = str_replace("#@ @#", "", $contents);
file_put_contents($filename, $contents);

Это включает все поля в двойных кавычках, включая пустые

Ответ 3

Я думаю, что решение будет таким,

$order_header_arr = array("Item1", "Item2","This is Item3");
fputcsv($fp, $order_header_arr,',',' ');

запомнить " " [Пробел] Между третьим параметром fputcsv

Ответ 4

По какой-либо причине вы не можете str_replace (',', ', ",', $output);? Вам также нужно будет увидеть, является ли последний или первый символ запятой, и если да, замените запятую",

Ответ 5

fputcsv не будет включать все переменные массива в кавычки. Наличие числового значения массива без кавычек может быть правильным, но представляет собой проблему, когда ярлык или адресная программа сталкивается с числовым индексом почтового индекса США, потому что при печати он будет лишать начальные нули. Таким образом, 05123-0019 становится 5123-19.

Чтобы заключить все значения, независимо от того, существуют они или нет, в кавычках я читаю входной файл с помощью fgetsrc и записываю исправленную версию с использованием fwrite. fgetsrc считывает запись в переменные массива. Поскольку fwrite записывает переменную, вы должны вывести переменные массива, заключить их в кавычки и разделить переменную массива запятой. Затем добавьте разделитель записи.

<?php
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite.
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!");
while (!feof($file_in)) {  //loop through each record of the input file
    $ar=fgetcsv($file_in); //read the record into array $ar   
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
        $arc = ""; //clear variable $arc  
        foreach ($ar as $value) {      
            $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc
        }   
        $arc .= "\n"; //add end of record to variable $arc
        fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc
    }
}
echo "end of job";
fclose($file_in);
fclose($file_out);
?>