Оберните 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);
?>