Принуждение fputcsv использовать корпус для *всех* полей

StackOverflow https://stackoverflow.com/questions/2489553

  •  21-09-2019
  •  | 
  •  

Вопрос

Когда я использую fputcsv Чтобы записать строку в дескриптор открытого файла, PHP добавит закрывающий символ в любой столбец, который, по его мнению, в нем нуждается, но оставит другие столбцы без вложений.

Например, у вас может получиться такая строка

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

Если не считать добавления фиктивного пробела в конец каждого поля, есть ли способ заставить fputcsv всегда заключать столбцы с символом вложения (по умолчанию ")?

Это было полезно?

Решение

Нет, 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(' ')
)

Опции «всегда включать» нет.

Другие советы

Не доволен этим решением, но это то, что я сделал и над чем работал.Идея состоит в том, чтобы установить пустой символ в качестве символа включения в fputcsv и добавить несколько кавычек к каждому элементу вашего массива.

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

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

Опираясь на Мартинответ, если вы хотите избежать вставки любых символов, которые не происходят из исходного массива (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);

После долгих поисков и некоторой утомительной проверки символов у меня есть версия приведенных выше кодов, созданная Диего и Ман который будет правильно удалять оболочки и заменять двойные кавычки во всех полях в 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;
}

Я надеюсь, что это будет полезно для кого-то.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top