#php #arrays #csv #spreadsheet
#php #массивы #csv #электронная таблица
Вопрос:
Я пытаюсь прочитать текстовый файл, преобразовать его в csv и отобразить в электронной таблице. Здесь много примеров, и я перепробовал многие из них, но результат тот же. Кажется, у меня две проблемы. Во-первых, код, который я использую для преобразования строки csv, добавляет дополнительную запятую в конец, и я не могу ее удалить. Во-вторых, даже при вводе тестовой строки электронная таблица не открывается.
Когда я читаю в своем тестовом файле, я получаю такой массив:
array [
Hunky Bill's Big Perogie / Pierogi Maker
9
4
10
5
5
1
2
1
]
Код, который я использую
$csv_file = 'arry.txt';
$save_name = 'csvout.csv';
if (($fp = fopen($csv_file ,'r'))) {
while(! feof($fp)) {
$item = fgets($fp);
$item = rtrim($item, "rn");
$csv_string .= '"' . $item . '",';
// $csv_string = substr($csv_string, 0, -1);
// $csv_string[strlen($csv_string)] = '';
// $csv_string = rtrim($csv_string, ',');
}
fclose($fp);
}
header("Expires: Mon, 26 Nov 2162 00:00:00 GMT");
header("Last-Modified: " . gmdate('D,d M Y H:i:s') . ' GMT');
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: Application/octet-stream");
header("Content-Disposition: attachment; filename=$save_name");
echo $csv_string;
Выполнение приведенного выше отображает это на экране:
"Hunky Bills Big Perogie Pierogi Maker","9","4","10","5","5","1","2","1","","",
Если я раскомментирую любую из трех строк, предназначенных для удаления этой последней запятой, все запятые будут удалены. Почему это?
Если я пропущу вышесказанное и просто введу эту строку перед оператором echo, электронная таблица все равно не откроется. Должен ли он открываться в программе электронных таблиц?
$csv_string = '"Hunky Bills Big Perogie Pierogi Maker","9","4","10","5","5","1","2","1"';
Кто-нибудь может увидеть, в чем мои проблемы?
Ответ №1:
Используемый вами цикл while добавляет запятую после каждого элемента. «Три строки, предназначенные для удаления последней запятой», расположены внутри цикла while. Чтобы решить эту проблему, попробуйте реорганизовать свой код следующим образом, с удалением последней запятой после завершения цикла while:
if (($fp = fopen($csv_file ,'r'))) {
while(! feof($fp)) {
$item = fgets($fp);
$item = rtrim($item, "rn");
$csv_string .= '"' . $item . '",';
}
$csv_string = substr($csv_string, 0, -1);
fclose($fp);
}
Далее, echo $csv_string
в конце кода дается указание программе вывести строку на экран, так что это то, что вы видите. Возможно, вы захотите сохранить $csv_string в текстовый файл с расширением .csv, а затем попытаться открыть его с помощью программы для работы с электронными таблицами.
Комментарии:
1. Спасибо за исправление запятой. Но я, возможно, не совсем понимаю вторую проблему. Когда страница загружается, я хочу, чтобы текстовый файл был удален, а затем он был открыт в файле электронной таблицы. Разве это не цель операторов заголовка?
Ответ №2:
Во-первых, при отладке такого рода цитат пропустите все header
материалы и Excel, пока они вам действительно не понадобятся. Это намного проще для отладки с необработанным текстом.
Во-вторых, вместо echo
того, чтобы проверить var_dump
, он показывает содержимое переменных более понятным способом.
Я рекомендую сохранить содержимое в массиве и разделить его запятой в конце, подробнее см. Комментарии.
// We'll store items here temporarily
$csv_items = [];
if (($fp = fopen($csv_file, 'r'))) {
while (!feof($fp)) {
$item = fgets($fp);
// Sanity check that we received something
if (false === $item) {
break;
}
// Trim both sides (unless you have a need for whitespace)
$item = trim($item);
// If we still have more than just an empty string
if ($item) {
// Append, optionally with quotes
$csv_items[] = '"'.$item.'"';
}
}
fclose($fp);
}
// Create final string
$csv_string = implode(',', $csv_items);
var_dump($csv_string);
Демонстрация здесь: https://3v4l.org/Chk2M
Кроме того, если ваши данные могут содержать кавычки, вам, возможно, придется иметь дело и с этим. Я лично использую для этого библиотеку, которая часто бывает излишней, но тогда мне не нужно беспокоиться об этом. Вы также можете написать CSV, используя fputcsv
и другие.
Комментарии:
1. На случай, если у кого-нибудь возникнет моя вторая проблема, оказалось, что файл включается в начало файла, перед командами заголовка. В этом файле содержится html-код. Я переместил его дальше по странице, и теперь электронная таблица открывается при загрузке.