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

этот код создает файл 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);
    }

person karto    schedule 06.04.2011    source источник
comment
Почему бы не попробовать использовать встроенную в PHP функцию fputcsv()?   -  person Mark Baker    schedule 06.04.2011
comment
спасибо Марк: читаю об этом сейчас. Вы можете дать мне фору относительно того, что у меня есть?   -  person karto    schedule 06.04.2011


Ответы (4)


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

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

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

person Geoffroy    schedule 06.04.2011
comment
Не за что ;) Пусть это и не лучшее решение, хоть и для php4 - person Geoffroy; 06.04.2011
comment
@Geoffroy: в конце каждой записи есть запятая. Любые идеи? - person karto; 06.04.2011
comment
@karto Нет, запятая разделяет два значения, а записи разделяются с помощью \n или \r или даже \n\r. Я имею в виду, что если в конце записи есть запятая, от вас ожидают большей ценности, даже если это тоже сработает. - person Geoffroy; 06.04.2011
comment
@Geoffroy: цена, адрес, описание --›12, South Bay, хорошо, - person karto; 06.04.2011
comment
Окей, я не понял, что ты имеешь в виду. Просто добавьте подтверждение: если это не последнее значение, не добавляйте запятую в конце. - person Geoffroy; 06.04.2011

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

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

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

person Shakti Singh    schedule 06.04.2011
comment
Спасибо. есть ли это в php 4? Я попробую. но решение от Жоффруа сработало для меня. - person karto; 06.04.2011
comment
@karto php 4 не имеет этой функции, но лучше ее использовать. Попробуйте обновить веб-сервер - person Geoffroy; 06.04.2011

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

SELECT col1, col2, col3 INTO OUTFILE '/tmp/export.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
person Gordon    schedule 06.04.2011
comment
спасибо Гордон: я попробовал ваше решение. это сработало. Но решение от Geoffroy соответствует тому, что я хотел сделать. - person karto; 06.04.2011

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

$somecontent .= str_replace(CHR(10), " ", $val);
$somecontent .= str_replace(CHR(13), " ", $val); 
person krifur    schedule 06.04.2011