2013-02-28 2 views
4

Я экспортирую данные в CSV-файл, используя fputcsv. У меня есть строки, которые пишутся, но у меня есть требование, чтобы данные были обернуты в двойные кавычки.Добавить цитаты в CSV-экспорт

foreach ($orderDetails['lines'] as $line) { 
    fputcsv($orderImportCsv, $line); 
} 

Это создает следующие при открытии в редакторе (возвышенного)

L, M3344,, 100

L, M3356,, 50

Мне нужно каждое из этих полей завернулось в двойные кавычки.

Так что я попытался это:

foreach ($lines as &$line) { 
    foreach ($line as &$column) { 
     $column = '"' . $column . '"'; 
    } 
} 

Так, по существу, это должно пройти через каждые полей строк и завернуть его в «». Однако после запуска, что я получаю следующий результат:

"" "L" "" "" "M3344" "" "" "" "" "" "100" ""

«» «L» «» «» «M3356» «» «» «» «» «» «50» «»

Это теперь положить 2 комплекта двойных кавычек вокруг переменной!

Есть ли лучший способ сделать это?

UPDATE

Я знаю fputcsv имеет два необязательных параметра. Разделитель и корпус. Однако я считаю, что вложение по умолчанию «", но только тогда, когда строка разделяется на отдельные слова.

ответ

3

Поскольку вы сами вставляете корпус, вы должны указать PHP, чтобы он не использовал его. Там, кажется, не быть документированы способ сделать это, но с использованием пространства, кажется, работает:

<?php 
foreach($orderDetails['lines'] as $line){ 
    foreach ($line as &$column) { 
     $column = '"' . $column . '"'; 
    } 
    unset($column); 

    fputcsv($orderImportCsv, $line, ',', ' '); 
} 

Или вы можете просто избежать fputcsv() и создавать все самостоятельно.

+0

Хотя работа вокруг этого, кажется, чтобы сделать работу. спасибо – iamjonesy

+0

Этот обходной путь определенно делает трюк, ОДНАКО, это раздражает, что fputcsv() добавляет дополнительные пробелы вокруг всего, когда «" используется как параметр $ enclosure, но не позволяет пустую строку в качестве самого приложения $. – hberg

1

Если у вас обязательно есть котировки на каждое поле, то fputcsv не будет достаточно хорошим, я боюсь. Он только ставит кавычки вокруг полей, которые, по его мнению, нуждаются в них, т. Е. Те, у которых есть пробелы или запятые, и т. Д.

Ваша попытка принудительного цитирования путем добавления их к значениям перед выполнением fputcsv не будет работать, потому что PHP видит эти кавычки как часть значений поля, и, следовательно, необходимо избегать (путем добавления дополнительных котировок).

Чтобы принудительно вводить кавычки во все поля, вам необходимо сгенерировать запись CSV вручную. Нечто подобное должно сделать трюк:

$quoteCSV = function($field) { 
    return '"'.$field.'"'; 
} 

foreach ($lines as $line) { 
    fputs($file, implode(',',array_walk($field, $quoteCSV))); 
} 

Примечания: 1. Этот код требует PHP 5.3 или выше, из-за использования лямбда-функции. 2. Я не пытался обрабатывать поля, которые содержат кавычки, поскольку вы не указали, как они должны быть экранированы.Вышеприведенный код приведет к сбою файла CSV, если какой-либо из данных содержит кавычки. Я оставлю это вам, чтобы исправить это по мере необходимости.

Надеюсь, что это поможет.

Я бы сказал, однако, что требование добавления котировок в каждое поле довольно необычно; хотя он будет признан CSV-файлом, большинство программ, которые генерируют CSV, будут делать то, что делает PHP, и при необходимости добавлять только цитаты. И практически каждая программа, которую я когда-либо встречал, которая читает CSV-файлы, полностью удовлетворена этой договоренностью. Возможно, стоит дважды проверить, почему это требование существует - это звучит как проблема с программным обеспечением на другом конце, а не с чем-либо, что вы должны делать в конце.

+0

Хорошее решение с использованием лямбда-функции, хотя есть небольшая ошибка ... array_walk возвращает логическое значение, поэтому implode будет вызывать ошибку. использовать array_walk в строке $ (не $) перед вызовом implode. Кроме того, функция лямбда должна передавать $ поле через ссылку, поэтому должно быть поле & $. С этими изменениями все работает отлично! – frijj2k

-1

Это просто нормально, если создать CSV-файл с помощью Excel и приложить одну ячейку с двойной квоты, то он будет добавить другие к исходному файлу, например:

Это как CSV отображается в Microsoft Office Excel 2007:

" 
"" 
""" 
"""" 
""""" 

Исходный код:

"""", 
"""""", 
"""""""", 
"""""""""", 
"""""""""""", 

Тогда ничего не пойдет не так, как вы можете увидеть первый пример в documentation:

<?php 

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'), 
    array('123', '456', '789'), 
    array('"aaa"', '"bbb"') 
); 

$fp = fopen('file.csv', 'w'); 

foreach ($list as $fields) { 
    fputcsv($fp, $fields); 
} 

fclose($fp); 
?> 

Приведенный выше пример будет написать следующее FILE.CSV:

aaa,bbb,ccc,dddd 
123,456,789 
"""aaa""","""bbb""" 
Смежные вопросы