Как правильно экспортировать в файл CSV со значением записи таблицы с запятой в нем? - PullRequest
0 голосов
/ 17 февраля 2009

У меня есть функция, которая экспортирует значения в CSV-файл, но в поле «комментарии» есть запятые, и он портит столбцы при открытии его в программе для работы с электронными таблицами.

Есть ли способ экспортировать его правильно?

//this exports only names and comments into a CSV file
function exportNamesCommentsCSV($table, $columns) {
    $file = "volunteer_comments";
    $csv_output = '';
    $table = 'volunteers_2009';
    $result = mysql_query("select * FROM ".$table."");
    $i = 0;
    if (mysql_num_rows($result) > 0) {
        while ($row = mysql_fetch_assoc($result)) {
            $csv_output .= $row['Field'].", ";
            $i++;
        }
    }
    $csv_output .= "\n";

    $values = mysql_query("SELECT lname, fname, email, comments FROM ".$table."");

    while ($rowr = mysql_fetch_row($values)) {
        for ($j=0;$j<$i;$j++) {
            $csv_output .= $rowr[$j].", ";
        }
        $csv_output .= "\n";
    }

    $filename = $file."_".date("Y-m-d_H-i",time());
    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: csv" . date("Y-m-d") . ".csv");
    header( "Content-disposition: filename=".$filename.".csv");
    print $csv_output;
    exit;
}

РЕДАКТИРОВАТЬ: Это будет пример комментария ...

Я бы предпочел работать с воротами, но я действительно могу работать где угодно.

, (запятая) в приведенном выше примере комментария отбрасывает правильную структуру столбца.

Ответы [ 4 ]

9 голосов
/ 17 февраля 2009

Что вам нужно сделать, это заключить значения в кавычки, например:

"value","value","value"

Это будет правильно обрабатывать запятые в значениях, а числовые значения также будут работать нормально.

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

Bobby says, "Hi!"

это должно быть представлено как

"some value","Bobby says, ""Hi!""","Some other value"

Вы можете сделать это с:

$csv_value = "\"" . eregi_replace("\"", "\"\"", $orig_value) . "\"";
6 голосов
/ 17 февраля 2009

PHP имеет функции для создания файлов, разделенных запятыми.

Проверьте функцию fputcsv. Это позволяет вам сделать что-то вроде этого:

<?php
$list = array (
    array('this has, commas, in it','bbb','ccc','dddd'),
    array('123','456','789', 'this is "like this"'),
    array('1234','124','1242', 'yay, woo"!"')
);

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

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

fclose($fp);
?>

В файле file.csv будет это:

"this has, commas, in it",bbb,ccc,dddd
123,456,789,"this is ""like this"""
1234,124,1242,"yay, woo""!"""

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

Итак, в вашей ситуации все, что вам нужно сделать, - это создать массив массивов, каждый из которых имеет имя и комментарий, а затем пропустить его через fputcsv, и вы получите золото.

4 голосов
/ 17 февраля 2009

Вы захотите обернуть запись в классификатор; обычно цитаты.

"col1", "col2,,,", "col3"

Если в записи есть кавычки, вам нужно их удвоить.

Вот Википедия статья

0 голосов
/ 17 февраля 2009

Один из способов добиться того, чего вы хотите, - это выполнить поиск и заменить поле «комментарии», если вы уверены, что это единственное поле, которое может содержать встроенные запятые.

Вам также может понадобиться проверить, что в вашем мемо-поле не может быть CR или LF, они также будут портить импорт вашего CSV-файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...