Я как раз собирался задавать те же вопросы, что и вопрос, заданный здесь … Принуждение fputcsv к использованию Enclosure For * all * Fields
Вопрос состоял в том,
Когда я использую 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-файл, в которое будет вложено каждое поле … Каким будет наилучшее решение?
Заранее спасибо…
Бросьте свою собственную функцию – ее не сложно:
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)
C.
Обходной путь: предположим, что у вас есть данные в двумерном массиве, вы можете добавить строку, которая заставит котировку, и вы уверены, что не содержится в ваших данных (здесь # @ @ # здесь), а затем удалите ее:
$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);