#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);