Принуждение fputcsv к использованию Enclosure For * all * Fields
Когда я использую fputcsv, чтобы записать строку в дескриптор открытого файла, PHP добавит закрытый символ в любой столбец, который он считает, что это нуждается, но оставит другие столбцы без корпусов.
Например, у вас может получиться строка, подобная этой
11,"Bob ",Jenkins,"200 main st. USA ",etc
За исключением добавления фиктивного пространства в конец каждого поля, есть ли способ заставить fputcsv всегда заключать столбцы с символом оболочки (по умолчанию для ")?
Ответы
Ответ 1
Нет, fputcsv() только закрывает поле при следующих условиях
/* 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(' ')
)
Нет опции "всегда прилагать".
Ответ 2
Не нравится это решение, но это то, что я сделал и работал. Идея состоит в том, чтобы установить пустой символ char в качестве символа оболочки fputcsv и добавить некоторые кавычки для каждого элемента вашего массива.
function encodeFunc($value) {
return "\"$value\"";
}
fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
Ответ 3
На основе Martin ответьте, если вы хотите избежать вставки каких-либо символов, которые не связаны с исходным массивом (Chr(127)
, Chr(0)
, и т.д.), вы можете заменить строку fputcsv() следующим образом:
fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
Предоставлено, fputs() медленнее, чем fputcsv(), но это более чистый вывод. Таким образом, полный код:
/***
* @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);
Ответ 4
После большого количества scrafffing и некоторой несколько утомительной проверки персонажа, у меня есть версия вышеупомянутых ссылочных кодов Diego и Mahn, который будет правильно вырезать кодировки и заменить двойными кавычками на все поля в fputcsv
. а затем вывести файл в браузер для загрузки.
У меня также была вторичная проблема, заключающаяся в том, что вы не можете быть уверены, что двойные кавычки всегда/никогда не исчезали.
В частности, при выводе непосредственно в браузер с использованием входного потока php://по ссылке Диего. Chr(127)
- это символ пробела, поэтому файл CSV имеет несколько пробелов, чем в противном случае, но я считаю, что это оборачивает проблему chr(0)
NULL символов в 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;
}
Надеюсь, это полезно для кого-то.