Включение каждого поля с двойными кавычками в 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;