Таким образом, мой код генерирует 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
?
Обычно это не проблема для файлов CSV.
fputcsv ставит кавычки вокруг значения, если он будет неоднозначным. Например,
a,b,"long string, with commas",,
не является двусмысленным, но,
a,b,long string, with commas,,
является и будет в большинстве случаев (читать: все) интерпретировать CSV-считыватель как имеющий более 5 полей.
Парсеры CSV будут принимать строковые литералы, даже без кавычек вокруг них.
Если вам все равно нужны котировки вокруг значений, следующий фрагмент будет делать это. Он не избегает кавычек внутри строки – это упражнение остается для читателя:
$row = '"' . implode('", "', $rowitems) . '"';
Вы хотели бы поместить это в цикл для всех своих строк.
Я работал над этим, вставив некоторые фиктивные строковые символы с пробелом # @ @ #, а затем удалив их. Вот пример реализации:
//$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);
Это включает все поля в двойных кавычках, включая пустые
Я думаю, что решение будет таким,
$order_header_arr = array("Item1", "Item2","This is Item3"); fputcsv($fp, $order_header_arr,',',' ');
помните " "
[Пробел] Между третьим параметром fputcsv
По какой-либо причине вы не можете str_replace (',,', ', "",', $ output); ? Вам также нужно будет увидеть, является ли последний или первый символ запятой, и если да, замените запятую «,»
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); ?>