Создание CSV-файла из таблицы MySQL с использованием php

#php #csv #export-to-csv

#php #csv #экспорт в csv

Вопрос:

этот код создает CSV-файл. Однако я избежал вывода запятых в полях, поскольку они используются в качестве разделителя (см. строку 22). Теперь я хочу удалить (возврат каретки и новые строки) из полей. Добавление $somecontent .= str_replace(«n», «», $val); в строке 23, похоже, не работает. есть идеи?

 @chmod($export_csv, 0777);
    $fe = @fopen($export_csv."/export.csv", "w ");
    if($fe){           
        $somecontent = "";
        $fields_count = 0;
        // print field headers
        $db->query($sql_view);
        if($row = $db->fetchAssoc()){
            foreach($row as $key => $val){
                if($fields_count   > 0) $somecontent .= ",";
                $somecontent .= ucfirst($key);
            }
        }
        $somecontent .= "n"; 

        // print field values
        $db->query($sql_view);
        while($row = $db->fetchAssoc()){
            $fields_count = 0;
            foreach($row as $key => $val){
                if($fields_count   > 0) $somecontent .= ",";
                $somecontent .= str_replace(",", "", $val);
                $somecontent .= str_replace("n", "", $val);
            }
            $somecontent .= "n";                    
        }

        // write some content to the opened file.
        if (fwrite($fe, $somecontent) == FALSE) echo 'file_writing_error'." (export.csv)"; 
        fclose($fe);
    }
  

Комментарии:

1. Почему бы не попробовать использовать встроенную в PHP функцию fputcsv()?

2. спасибо, Марк: читаю об этом сейчас. можете ли вы дать мне представление о том, что у меня есть?

Ответ №1:

Используйте функцию fputcsv для записи CSV-файлов. В PHP уже есть функция для записи CSV-файлов.

Вам не нужно обрабатывать экранирование, разделитель самостоятельно, все это уже обработано.

Это справится со всеми этими задачами за вас и избавит вас от многих головных болей.

Комментарии:

1. Спасибо. есть ли это в php 4? Я попробую это. но решение от Geoffroy сработало для меня.

2. @karto в php 4 нет этой функции, но лучше ее использовать. Попробуйте обновить свой веб-сервер

Ответ №2:

Вы можете сделать это напрямую из MySQL:

 SELECT col1, col2, col3 INTO OUTFILE '/tmp/export.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY 'n'
FROM test_table;
  

Комментарии:

1. спасибо, Гордон: я попробовал ваше решение. это сработало. Но решение от Geoffroy соответствует тому, что я хотел сделать.

Ответ №3:

Где ваш $somecontent .= str_replace("n", "", $val) ? Я не могу найти его в вашем коде.

Вы можете указать массив в качестве первого параметра для, str_replace как указано там. Таким образом, каждая строка, присутствующая в вашем массиве, будет заменена вторым параметром.

Например, $somecontent .= str_replace(array("n", "r"), "", $val);

Комментарии:

1. Добро пожаловать 😉 Даже если это не лучшее решение, хотя оно для php4

2. @Geoffroy: в конце каждой записи есть запятая. есть идеи?

3. @karto Нет, два значения разделяются запятой, а запись разделяется с помощью n или r или даже n r. Я имею в виду, что если в конце записи есть запятая, от вас ожидают большего значения, даже если это также сработало бы

4. @Geoffroy: цена, адрес, описание ->12,Саут-Бей,хорошо,

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

Ответ №4:

вы можете попробовать что-то подобное, играя с символами ASCII

 $somecontent .= str_replace(CHR(10), " ", $val);
$somecontent .= str_replace(CHR(13), " ", $val);