Frage

Wenn ich fputcsv eine Zeile in einen offenen Datei-Handle zu schreiben, wird PHP einen einschließenden Charakter in der jede Spalte, dass sie glaubt, braucht es werden aber auch andere Spalten ohne die Gehäuse lassen.

Zum Beispiel könnten Sie mit einer Zeile wie diese

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

Kurz von einem falschen Raum zu Ende jeden Feld anhängt, ist es eine Möglichkeit, um Kraft fputcsv immer beilegen Spalten mit dem Gehäuse (standardmäßig ein „) Zeichen?

War es hilfreich?

Lösung

Nein, fputcsv () umschließt nur das Feld unter den folgenden Bedingungen

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

Es gibt keine "immer beilegen" Option.

Andere Tipps

Nicht zufrieden mit dieser Lösung, aber es ist das, was ich tat und arbeitete. Die Idee ist, ein leeres Zeichen als Gehäuse Zeichen auf fputcsv zu setzen und einige Zitate auf jedem Element Ihrer Array hinzuzufügen.

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

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

Aufbauend auf Martin 's Antwort, wenn Sie irgendwelche Zeichen eingefügt vermeiden möchten, die von der Quelle stammen nicht Array (Chr(127), Chr(0), usw.), können Sie die fputcsv () Linie mit dem anstelle folgenden ersetzen:

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

Zugegeben, fputs () ist langsamer als fputcsv (), aber es ist ein sauberer Ausgang. Der vollständige Code ist also:

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

Nach vielen scrafffing um und einig etwas langweiligen Charakter Prüfung, habe ich eine Version des oben aufgeführten Codes von Diego und Mahn das richtig Encasings Streifen aus wird und mit doppelten Anführungszeichen ersetzen auf allen Gebieten in fputcsv. und dann gibt die Datei an den Browser zum Download bereit.

Ich hatte auch eine sekundäre Frage der nicht in der Lage sicher zu sein, dass doppelte Anführungszeichen waren immer / nie entkommen.

Speziell für bei der Verwendung des PHP-Code direkt in Browser ausgibt: // Eingangsstrom, wie durch Diego verwiesen. Chr(127) ist ein Leerzeichen, so dass die CSV-Datei ein paar mehr Räume als sonst hat, aber ich glaube, dass dies das Problem der chr(0) NULL-Zeichen in UTF-8 ausweicht.

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

Ich hoffe, das für jemanden nützlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top