Запись CSV в файл без вложений на PHP


Существует ли собственная функция или солидный класс / библиотека для записи массива в виде строки в CSV-файл без вложений? fputcsv будет по умолчанию ", если ничего не передается для парама вложения. Google меня подводит (возвращает результаты для целой кучи страниц о fputcsv), и библиотеки PEAR делают более или менее то же самое, что и fputcsv.

Что-то, что работает точно так же, как fputcsv, но позволит полям оставаться без кавычек.

В настоящее время: "field 1","field 2",field3hasNoSpaces

Желаемое: field 1,field 2,field3hasNoSpaces

11 41

11 ответов:

Предупреждения о предыдущих приложениях действительны, но вы сказали, что они не применимы к вашему варианту использования.

Мне интересно, почему вы не можете просто использовать что-то вроде этого?
<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");

Работает с функцией chr () :

fputcsv($f,$array,',',chr(0));

fputcsv($file, $data, ';', chr(127));

Разве это не работает?

fputcsv($fp, split(',', $line),',',' ');

Ну car(0) не сработало, так как значение NULL, скорее всего, задушит большинство парсеров csv.

Я закончил использовать fputcsv() для построения исходного файла, затем прошел и удалил все кавычки. Элегантный? Может быть, и нет, но он выполнил свою работу :).

<?php       

$filename = "sample.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, ['column 1','column 2']);
$data = ['sample','data'];

fputs($handle, implode($data,',')."\n");

// or

fwrite($handle, implode($data,',')."\n");

fclose($handle);
$headers = array(
    'Content-Type' => 'text/csv',
);

Это то, что я использую, чтобы поместить стандартный CSV в массив...

function csv_explode($delim=',', $str, $enclose='"', $preserve=false){
        $resArr = array();
        $n = 0;
        $expEncArr = explode($enclose, $str);
        foreach($expEncArr as $EncItem){
                if($n++%2){
                        array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:''));
                }else{
                        $expDelArr = explode($delim, $EncItem);
                        array_push($resArr, array_pop($resArr) . array_shift($expDelArr));
                        $resArr = array_merge($resArr, $expDelArr);
                }
        }
        return $resArr;
} 

Затем вы можете вывести все, что хотите, в цикле foreach.

Обратная сторона с CSV-файлом без вложений означает, что ошибочная запятая в пользовательском вводе будет уничтожать строку. Таким образом, вам нужно будет удалить запятые перед написанием строки CSV.

Самая сложная часть работы с CSV-это разбор вложений, что делает функции PHP и PEAR CSV ценными. По сути, вы ищете файл, разделенный запятыми для столбцов и разделенный новой строкой для строк. Вот простая отправная точка:

<?php
$col_separator= ',';
$row_separator= "\n";

$a= array(
 array('my', 'values', 'are', 'awes,breakit,ome'),
 array('these', 'values', 'also', "rock\nAND\nROLL")
);

function encodeRow(array $a) {
 global $col_separator;
 global $row_separator;
 // Can't have the separators in the column data!
 $a2= array();
 foreach ($a as $v) {
  $a2[]= str_replace(array($col_separator, $row_separator), '', $v);
 }
 return implode($col_separator, $a2);
}

$output= array();
foreach ($a as $row) {
 $output[]= encodeRow($row);
}

echo(implode($row_separator, $output));

?>

chr(0) также работал на меня:

 fputcsv($fp, $aLine, $sDelimiter, chr(0));

Я использую хитрый способ удаления двойной кавычки, но только в Linux

....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');

Понял это. Передавая код ascii для Null в функцию car(), он, кажется, работает просто отлично.

fputcsv($f, $array, $delimiter, car(0))

Спасибо всем за ответы!!!