php fputcsv и окружающие поля - PullRequest
7 голосов
/ 25 марта 2010

Я как раз собирался задать те же вопросы, что и вопрос, заданный здесь .... Принудительное использование fputcsv Enclosure для * всех * полей

Вопрос был

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

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

11, «Боб», Дженкинс, «200 главных улиц США». », И т.д.

За исключением добавления фиктивного пространства к конец каждого поля, есть ли способ заставить 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(' ')
)

Нет опции "всегда заключать".

Мне нужно создать CSV-файл, будет ли каждое поле закрыто ... Каково было бы лучшее решение?

Заранее спасибо ...

Ответы [ 2 ]

7 голосов
/ 25 марта 2010

Сверните свою собственную функцию - это не сложно:

 function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep)
 {
     dumbescape(false, $enclosure);
     $data_array=array_map('dumbescape',$data_array);
     return fputs($file_handle, 
         $enclosure 
         . implode($enclosure . $field_sep . $enclosure, $data_array)
         . $enclosure . $record_sep);
 }
 function dumbescape($in, $enclosure=false)
 {
    static $enc;
    if ($enclosure===false) {
        return str_replace($enc, '\\' . $enc, $in);
    }
    $enc=$enclosure;
 }

(выше используется экранирование в стиле Unix)

С

1 голос
/ 11 февраля 2011

Обходной путь: предположим, что у вас есть данные в двумерном массиве, вы можете добавить строку, которая будет приводить к кавычкам, и вы уверены, что она не содержится в ваших данных («# ​​@ @ #» здесь), а затем удалить ее. :

    $fp = fopen($filename, 'w');
    foreach ($data as $line => $row) {
        foreach ($row as $key => $value) {
            $row[$key] = $value."#@ @#";
        }           
        fputcsv($fp, $row);
    }

    fclose($fp);
    $contents = file_get_contents($filename);
    $contents = str_replace("#@ @#", "", $contents);
    file_put_contents($filename, $contents);
...