Pergunta

Existe uma função nativa ou sólida classe / biblioteca para escrever uma matriz como uma linha em um arquivo CSV sem caixas? fputcsv será o padrão para " se nada é passado para o param gabinete. Google está me falhando (retornando resultados para um monte de páginas sobre fputcsv), e bibliotecas de PERA fazer mais ou menos as mesmas coisas que fputcsv.

Algo que funciona exatamente como fputcsv, mas permitirá que os campos de permanecer sem aspas.

atualmente: "field 1","field 2",field3hasNoSpaces

desejado: field 1,field 2,field3hasNoSpaces

Foi útil?

Solução

As advertências sobre cercos anteriores são válidas, mas você disse que não se aplicam a seu caso de uso.

Eu estou perguntando por que você não pode simplesmente usar algo como isto?

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");

Outras dicas

trabalha com chr () Função:

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

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

não funciona?

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

Bem car(0) não funcionou como o valor NULL provavelmente irá sufocar a maioria dos analisadores CSV.

Acabei usando fputcsv() para construir o arquivo inicial, em seguida, passou e removido todas as citações. Elegante? Talvez não, mas ele obteve o trabalho:.)

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

Eu uso o caminho complicado para remover aspas duplas, mas apenas em Linux

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

Isto é o que eu uso para colocar CSV padrão em uma matriz ...

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;
} 

Você pode então saída o que quiser em um loop foreach.

A desvantagem com um arquivo CSV sem recintos significa uma vírgula errante na entrada do usuário será munge a linha. Então você vai precisar para remover vírgulas antes de escrever uma linha CSV.

A parte complicada com a manipulação CSV é analisar caixas, o que torna as funções PHP e PEAR CSV valioso. Essencialmente você está procurando um arquivo que é para colunas e nova linha delimitada por linhas separado por vírgulas. Aqui está um simples ponto de partida:

<?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) também trabalhou para mim:

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

Descobri-lo. Ao passar no código ASCII para nulo para a função car() parece funcionar muito bem.

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

Obrigado pelas respostas todos !!!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top