php fputcsv и заключающие его поля
Вопрос
Я как раз собирался задать те же вопросы, что и приведенный здесь вопрос.... Принуждение fputcsv использовать Enclosure Для * всех * полей
Вопрос заключался в следующем
Когда я использую fputcsv для записи строки в дескриптор открытого файла, PHP добавит заключающий символ в любой столбец , который, по его мнению, нуждается в этом, но будет оставьте другие столбцы без вложений .
Например, в итоге может получиться строка , подобная этой
11,"Боб ",Дженкинс,"200 main st.США "и т. д
Если не добавлять фиктивный пробел в конец каждого поля, есть ли какой-нибудь способ заставить 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);