Pergunta

Quando eu uso fputcsv Para escrever uma linha em um identificador de arquivo aberto, o PHP adicionará um caractere anexando a qualquer coluna que acredite que precisa, mas deixará outras colunas sem os gabinetes.

Por exemplo, você pode acabar com uma linha como esta

11,"Bob ",Jenkins,"200 main st. USA ",etc

Além de anexar um espaço falso até o final de todos os campos, existe alguma maneira de forçar o FPUTCSV a incluir sempre colunas com o caráter do gabinete (padrão para um ")?

Foi útil?

Solução

Não, o fputcsv () inclui apenas o campo nas seguintes condições

/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
  FPUTCSV_FLD_CHK(enclosure) ||
  FPUTCSV_FLD_CHK(escape_char) ||
  FPUTCSV_FLD_CHK('\n') ||
  FPUTCSV_FLD_CHK('\r') ||
  FPUTCSV_FLD_CHK('\t') ||
  FPUTCSV_FLD_CHK(' ')
)

Não há opção "sempre inclua".

Outras dicas

Não estou feliz com esta solução, mas foi o que eu fiz e trabalhei. A idéia é definir um caractere de char vazio como um caractere de gabinete no FPUTCSV e adicionar algumas citações em todos os elementos da sua matriz.

function encodeFunc($value) {
    return "\"$value\"";
}

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));

Construindo em MartinResposta, se você deseja evitar a inserção de caracteres que não se originam da matriz de origem (Chr(127), Chr(0), etc), você pode substituir a linha fputcsv () pelo seguinte: em vez disso:

fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");

Concedido, o fputs () é mais lento que o fputcsv (), mas é uma saída mais limpa. O código completo é assim:

/***
 * @param $value array
 * @return string array values enclosed in quotes every time.
 */
function encodeFunc($value) {
    ///remove any ESCAPED double quotes within string.
    $value = str_replace('\\"','"',$value);
    //then force escape these same double quotes And Any UNESCAPED Ones.
    $value = str_replace('"','\"',$value);
    //force wrap value in quotes and return
    return '"'.$value.'"';
}

$fp = fopen("filename.csv", 'w');
foreach($table as $row){
    fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
}
fclose($fp);

Depois de muito rabiscar e algumas verificações de personagens um tanto tediosas, eu tenho uma versão dos códigos referenciados acima por Diego e Mahn isso vai despir corretamente as capas e substituir por cotações duplas em todos os campos em fputcsv. e em seguida, saia o arquivo para o navegador para fazer o download.

Eu também tive uma questão secundária de não ter certeza de que as cotações duplas sempre foram / nunca escaparam.

Especificamente para a saída diretamente do navegador usando o fluxo de entrada php: //, conforme referenciado pelo Diego. Chr(127) é um personagem espacial, então o arquivo CSV tem mais alguns espaços do que de outra forma, mas acredito que isso evita a questão de chr(0) Caracteres nulos no UTF-8.

/***
 * @param $value array
 * @return string array values enclosed in quotes every time.
 */
function encodeFunc($value) {
    ///remove any ESCAPED double quotes within string.
    $value = str_replace('\\"','"',$value);
    //then force escape these same double quotes And Any UNESCAPED Ones.
    $value = str_replace('"','\"',$value);
    //force wrap value in quotes and return
    return '"'.$value.'"';
}


$result = $array_Set_Of_DataBase_Results;
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export-'.date("d-m-Y").'.csv"');
    foreach($result as $row) {
        fputcsv($fp, array_map("encodeFunc", $row), ',', chr(127));
    }
    unset($result,$row);
    die;
}

Espero que isso seja útil para alguém.

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