Question

Quand j'utilise fputcsv pour écrire une ligne à un fichier ouvert, PHP ajoutera un caractère englobante à une colonne qu'il croit en a besoin, mais laissera d'autres colonnes sans les pièces jointes.

Par exemple, vous pourriez vous retrouver avec une ligne comme

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

Court de annexant un espace bogus à la fin de chaque domaine, est-il possible de forcer fputcsv à enfermer toujours des colonnes avec l'enceinte (par défaut un « ) caractère?

Était-ce utile?

La solution

Non, fputcsv () renferme uniquement le champ dans les conditions suivantes

/* 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(' ')
)

Il n'y a pas d'option "toujours placer".

Autres conseils

Non content de cette solution, mais il est ce que je l'ai fait et travaillé. L'idée est de définir un omble chevalier vide comme caractère d'enceinte sur fputcsv et ajouter quelques citations sur chaque élément de votre tableau.

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

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

Miser sur la réponse de Martin , si vous voulez éviter d'insérer des caractères qui ne découlent pas de la source array (Chr(127), Chr(0), etc.), vous pouvez remplacer la ligne fputcsv () avec les éléments suivants à la place:

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

Certes, fputs () est plus lente que fputcsv (), mais il est une sortie propre. Le code complet est donc:

/***
 * @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);

Après beaucoup de scrafffing autour et un peu de caractère un peu fastidieux de vérifier, j'ai une version des codes mentionnés ci-dessus par Diego et Mahn qui supprime correctement encasings et le remplacer par des guillemets doubles sur tous les champs de fputcsv. puis sortie le fichier dans le navigateur pour télécharger.

J'ai aussi eu un problème secondaire de ne pas pouvoir être sûr que des guillemets doubles étaient toujours / jamais se sont échappés.

Plus précisément lorsque la sortie directement au navigateur en utilisant le php: // flux d'entrée comme référencé par Diego. Chr(127) est un espace pour que le fichier CSV a un peu plus que des espaces autrement, mais je crois que ce problème de la élude des caractères NULL chr(0) en 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;
}

J'espère que cela est utile pour quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top