Пустая строка в начале при записи файла csv в php

Я пытаюсь написать CSV-файл из массива в качестве заголовка CSV-файла.

$csv_fields[] = 'produto_quest';
$csv_fields[] = 'produto_quest1';
$csv_fields[] = 'comentario_aspecto_atm';
$csv_fields[] = 'aspecto_geral_int';
$csv_fields[] = 'organizacao_espaco';

$f = fopen('php://memory', 'w+');
fputcsv($f, $csv_fields, ";");

foreach ($relat as $fields) { // load from MySQL as a multidimensional array
    foreach($fields as $key => &$value1) {
        $value1 = iconv("UTF-8", "", $value1);
    }
    fputcsv($f, $fields, ";");
}
fseek($f, 0);
fpassthru($f);
fclose($f);

Все в файле правильно, кроме скрытого символа в начале файла. Если я открываю файл с помощью блокнота, он отображается правильно, но в Excel в начале есть пустая строка. Может кто-нибудь помочь мне?


person RBrazao    schedule 23.11.2013    source источник
comment
В заголовке вопроса вы говорите пустую строку, но затем вы говорите скрытый символ. Что это?   -  person cen    schedule 24.11.2013
comment
Я не могу определить, потому что я не вижу, что делает первую строку csv пустой, так как в блокноте ничего не кажется неправильным.   -  person RBrazao    schedule 24.11.2013


Ответы (3)


Используйте ob_clean(); прямо перед $f = fopen('php://memory', 'w+');

Пример:

ob_clean();
$f = fopen('php://memory', 'w+');

У меня отлично работает удаление всех пустых строк в начале файла CSV.

person Silambarasan R.D    schedule 26.08.2019

Аналогичный вопрос обсуждался здесь:

Как можно Я вывожу CSV-файл UTF-8 в PHP, который Excel будет правильно читать?

Посмотрите на решение, получившее наибольшее количество голосов, которое отображает результат вместо записи во временный файл. Это выглядит так:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;

ОБНОВИТЬ:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

$csv_fields[] = 'produto_quest';
$csv_fields[] = 'produto_quest1';
$csv_fields[] = 'comentario_aspecto_atm';
$csv_fields[] = 'aspecto_geral_int';
$csv_fields[] = 'organizacao_espaco';

$f = fopen('php://memory', 'w+');
fputcsv($f, $csv_fields, ";");

foreach ($relat as $fields) { // load from MySQL as a multidimensional array
    foreach($fields as $key => &$value1) {
        $value1 = iconv("UTF-8", "", $value1);
    }
    fputcsv($f, $fields, ";");
}
fseek($f, 0);
fpassthru($f);
fclose($f);
person fiLLLipnet    schedule 23.11.2013
comment
вы предлагаете повторить файл вместо использования fputcsv? - person RBrazao; 24.11.2013
comment
Я просто смотрел на другое предложение, но вижу, что вместо последней строки в коде, который я предложил, вы можете вставить свой код. Это должно сработать :) Я обновил свое предложение. - person fiLLLipnet; 24.11.2013
comment
С этим эхом я получаю  в начале или в конце файла, в зависимости от позиции эха - person RBrazao; 24.11.2013
comment
Если я использую обновленный код, в Excel это выглядит так: db.tt/xy3QM237 И вот так в Notepad++ : db.tt/9RvUoq47 - person fiLLLipnet; 24.11.2013
comment
Маркер BOM должен быть первым символом файла. Если обновление в моем ответе верное, то в вашем документе есть какой-то пробел (из источника php), затем спецификация, затем данные CSV. Вот почему спецификация отображается как обычные символы. - person Andrei B; 24.11.2013
comment
Если я вставляю свой код и только мой код в новый файл php, он работает. Как выглядит ваш полный код? Выводит ли он что-нибудь еще перед вставленным кодом? - person fiLLLipnet; 24.11.2013

person    schedule
comment
Вы получаете пустую строку перед первым символом, как и я - person RBrazao; 24.11.2013
comment
Я получаю dropbox.com/s/ix20tp5xf17dldt/Capturar.PNG даже с предложение от @fiLLLipnet - person RBrazao; 24.11.2013
comment
если вы имеете в виду пустую строку над produto_quest, это стандартная пустая строка между заголовком HTTP и телом. Все ответы HTTP имеют это. После нее, как видите, нет другой пустой строки. - person Andrei B; 24.11.2013
comment
Обратите внимание, что это не устраняет фактическую проблему (дополнительный символ вне ‹?php). Тем не менее, вы можете использовать его, но лучше всего, если вы удалите этого персонажа. - person Andrei B; 24.11.2013