Включение каждого поля с двойными кавычками в CSV файл с помощью PHP?
Мне нужно поставить все строки и число с двойными кавычками в CSV файл с помощью PHP.
Как создать CSV файл из PHP во всех данных в двойных кавычках?
Я использую этот код для генерации CSV - я использую frameworkignign framework
$array = array(
array(
(string)'XXX XX XX',
(string)'3',
(string)'68878353',
(string)'',
(string)'[email protected]',
),
);
$this->load->helper('csv');
array_to_csv($array, 'blueform.csv');
Выход, который я получаю:
"XXX XX XX",3,68878353,,[email protected]
Ожидаемый результат:
"XXX XX XX","3","68878353","","[email protected]"
Код array_to_csv
if (!function_exists('array_to_csv')) {
function array_to_csv($array, $download = "") {
if ($download != "") {
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $download . '"');
}
ob_start();
$f = fopen('php://output', 'w') or show_error("Can't open php://output");
$n = 0;
foreach ($array as $line) {
$n++;
if (!fputcsv($f, $line)) {
show_error("Can't write line $n: $line");
}
}
fclose($f) or show_error("Can't close php://output");
$str = ob_get_contents();
ob_end_clean();
if ($download == "") {
return $str;
} else {
echo $str;
}
}
}
Заранее благодарю
Ответы
Ответ 1
У меня есть решение
эта функция преобразует многомерный массив в CSV с двойной кавычкой и
function arr_to_csv($arr)
{
$filePointer="export.csv";
$delimiter=",";
$enclosure='"';
$dataArray =$arr;
$string = "";
// No leading delimiter
$writeDelimiter = FALSE;
//foreach($dataArray as $dataElement)
foreach ($dataArray as $key1 => $value){
foreach ($value as $key => $dataElement)
{
// Replaces a double quote with two double quotes
$dataElement=str_replace("\"", "\"\"", $dataElement);
// Adds a delimiter before each field (except the first)
// Encloses each field with $enclosure and adds it to the string
if($writeDelimiter) $string .= $delimiter;
// $new_string = $enclosure . $dataElement . $enclosure;
$string .= $enclosure . $dataElement . $enclosure;
// Delimiters are used every time except the first.
$writeDelimiter = TRUE;
} // end foreach($dataArray as $dataElement)
$string .= "\n";
}
// Append new line
$string .= "\n";
//$string = "An infinite number of monkeys";
print($newstring);
// Write the string to the file
// fwrite($filePointer,$string);
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="'.$filePointer.'";');
}
Ответ 2
При создании CSV в PHP вы должны использовать функцию fputcsv, доступную с PHP 5
Из документации есть следующие параметры:
int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "\" ]]] )
В том, что у вас есть:
- ресурс, который вы пишете для
- Данные для ввода в CSV
- Разделитель (обычно запятые)
- Строковый блок (это бит, который вы хотите для своих котировок)
- Строка Escape (поэтому, если ваши данные содержат символ оболочки, вы можете избежать этого, чтобы избежать появления нового поля).
Поскольку значения по умолчанию для ,
для разделителя и "
для оболочки, вам не нужно добавлять больше. Это правильно покроет струны. Цифры - это другое дело. Там работает над этот вопрос SO, который я нашел после ввода большей части этого файла, а затем с проблемами с номерами:
Не нравится это решение, но это то, что я сделал и работал. Идея состоит в том, чтобы установить пустой символ char в качестве символа оболочки на fputcsv и добавить некоторые кавычки на каждый элемент вашего массива.
function encodeFunc($value) {
return "\"$value\"";
}
fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));
Ответ 3
Я использую здесь помощник CSV.
Для генерации результата из db-запроса для ex.
$sTable = "MY_TABLE_NAME";
$query = $this->db->get($sTable);
$this->load->helper('csv');
query_to_csv($query, TRUE, 'records.csv');
В CSV Helper onLine номер 65 Существует код для query_to_csv.
здесь csv_helper.php.
Я сделал небольшое редактирование там, если вы хотите все с двойной перевернутой запятой.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// ------------------------------------------------------------------------
/**
* CSV Helpers
* Inspiration from PHP Cookbook by David Sklar and Adam Trachtenberg
*
* @author Jérôme Jaglale
* @link http://maestric.com/en/doc/php/codeigniter_csv
*/
// ------------------------------------------------------------------------
/**
* Array to CSV
*
* download == "" -> return CSV string
* download == "toto.csv" -> download file toto.csv
*/
if ( ! function_exists('array_to_csv'))
{
function array_to_csv($array, $download = "")
{
if ($download != "")
{
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $download . '"');
}
ob_start();
$f = fopen('php://output', 'w') or show_error("Can't open php://output");
$n = 0;
foreach ($array as $line)
{
$n++;
if ( ! fputcsv($f, $line))
{
show_error("Can't write line $n: $line");
}
}
fclose($f) or show_error("Can't close php://output");
$str = ob_get_contents();
ob_end_clean();
if ($download == "")
{
return $str;
}
else
{
echo $str;
}
}
}
// ------------------------------------------------------------------------
/**
* Query to CSV
*
* download == "" -> return CSV string
* download == "toto.csv" -> download file toto.csv
*/
if ( ! function_exists('query_to_csv'))
{
function query_to_csv($query, $headers = TRUE, $download = "")
{
if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
{
show_error('invalid query');
}
$array = array();
if ($headers)
{
$line = array();
foreach ($query->list_fields() as $name)
{
$line[] = '"'.$name.'"';
}
$array[] = $line;
}
foreach ($query->result_array() as $row)
{
$line = array();
foreach ($row as $item)
{
$line[] = '"'.$item.'"';
}
$array[] = $line;
}
echo array_to_csv($array, $download);
}
}
/* End of file csv_helper.php */
/* Location: ./system/helpers/csv_helper.php */
Это даст Вставить двойную инвертированную запятую в имени столбца, а также в строках.
Вы также можете удалить "" это из имени столбца.
![введите описание изображения здесь]()
Ответ 4
Совместите строку с этим '"""';
Пример: '"""' . {{String}} . '"""';
Это должно сработать, это сработало для меня. Это способ вставить строку.
Ответ 5
Измените свой код немного.
fputcsv($f, $line)
Для
fputcsv($f,array_map('strval', $line), ',', '"')
Надеюсь, это поможет вам.
FYI: его в array_to_csv
Ответ 6
Я бы, вероятно, просто заменил fputcsv на домашнюю версию. Теперь я беру вашу структуру данных, чтобы всегда быть сеткой, подобной традиционным сетям и CSV файлам.
function getQuotedString($arr){
$buffer = "";
foreach($arr as $line){
$string = "";
foreach($line as $data){
// See if $string is no longer empty, meaning we need a comma to separate data
if($string !== "") $string .= ',';
$string .= '"' . $data . '"';
}
$buffer .= $string . PHP_EOL;
}
return $buffer;
}
Теперь используйте это в своем коде:
...
ob_start();
$f = fopen('php://output', 'w') or show_error("Can't open php://output");
$quotedData = getQuotedString($arr);
for ($written = 0; $written < strlen($data); $written += $fwrite) {
$fwrite = fwrite($f, substr($data, $written));
if ($fwrite === false) {
return $written;
}
}
fclose($f) or show_error("Can't close php://output");
$str = ob_get_contents();
ob_end_clean();
...
Затем вы можете использовать $write, чтобы узнать, сколько байтов было написано, или если вы хотите узнать, сколько строк было, вы можете просто использовать sizeof ($ arr).
Надеюсь, это поможет!
Ответ 7
Не работает ли функция implode для этого?
$array = [
(string)'XXX XX XX',
(string)'3',
(string)'68878353',
(string)'',
(string)'[email protected]'
];
$csvData = '"' . implode('","', $array) . '"';
а затем вы можете просто написать $csvData в свой файл?
Ответ 8
Конечно, есть другие способы справиться с этим, но используя fputcsv
и работает для большинства сценариев.
if(!function_exists('array_to_csv')) {
function array_to_csv($array, $download = "") {
ob_start();
$f = fopen('php://output', 'w') or die("Can't open php://output");
$counter = count($array);
for ($i = 0; $i < $counter; $i++) {
if(!fputcsv($f, array_map(function($value) { return '"'.$value.'"'; }, $array[$i]), ",", "\"")) {
die("Can't write line $i: ".print_r($array[$i], true));
}
}
fclose($f) or die("Can't close php://output");
$str = str_replace('"""', '"', ob_get_contents());
ob_end_clean();
if(strlen($download) > 0) {
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="'.$download.'"');
echo $str;
} else {
return $str;
}
}
}
Ответ 9
Не прилагайте усилий, чтобы обеспечить надлежащее закрытие каждой записи двойными кавычками. Существуют встроенные php-функции для выполнения задания без ошибок.
Не только двойные кавычки, вам потребуется одиночная кавычка ('
), двойная кавычка ("
), обратная косая черта (\
) и NULL (байт NULL).
Используйте fputcsv()
для записи и fgetcsv()
читать, что будет заботиться обо всех.
Ответ 10
Вы можете использовать функцию implode(), чтобы сделать код выше еще более простым:
$delimiter = ';';
$enclosure = '"';
$linefeed = "\n";
$lines = array();
// traversing data, one row at a time
foreach ($data as $row) {
$arr = array();
// traversing row, col after col
foreach ($row as $col => $val) {
// MySQL-style escaping double quotes
$val = str_replace('"','""',$val);
// wrapping each value in double quotes
$arr[] = sprintf('%s%s%s',$enclosure,$val,$enclosure);
}
// generating formatted line and storing it
$lines[] = implode($delimiter,$arr);
}
// join each lines to have the final output
$output = implode($linefeed,$lines);
echo $output;