Класс-парсер CSV файлов на PHP
Данный класс позволяет разобрать содержимое CSV файла для дальнейшей обработки.
<?php
// класса для разбора csv файла
class CsvParser
{
// указатель на файл
protected $handle;
// заголовок csv файла
protected $header;
/**
* Открываем файл на чтение
*
* @param $file
* @param bool $header
* @return $this
* @throws \Exception
*/
public function open($file, $header = true)
{
$this->handle = fopen($file, 'r');
if (!$this->handle) {
throw new Exception('Невозможно прочитать файл ' . $file);
}
if ($header) {
$this->header = fgetcsv($this->handle);
}
return $this;
}
/**
* Разбирает файл, передавая данные из файла
* в коллбэк функцию
*
*/
public function parse(callable $callable)
{
if (!$this->handle) {
throw new Exception('Файл не открыт!');
}
while (($data = fgetcsv($this->handle)) !== false) {
if ($this->header) {
$data = array_combine($this->header, $data);
}
// вызываем коллбэк, первый аргумент данные, второй ссылка на объект
$callable($data, $this);
}
}
public function __destruct() {
$this->close();
}
public function close()
{
if ($this->handle) {
fclose($this->handle);
$this->handle = null;
}
}
public function value($row, $field) {
return $row[$field];
}
}
Данные для разбора:
name, price, delivery
Iphone 11, 56980, yes
Samsung Galaxy 12, 59980, yes
Nokia Duo, 12990, no
Используем так:
<?php
require_once 'CsvParser.php';
$file = 'programs.csv';
(new CsvParser())->open($file)->parse(function ($data, CsvParser $csv) {
foreach ($data as $value) {
//$value = $csv->value($data, $fieldName);
print $value . PHP_EOL;
}
});
-
- Михаил Русаков
Комментарии (2):
Михаил, здравствуйте! Попробовал ваш парсер, хорошая реализация. Однако, он не выводит данные если в есть нулевые значения в csv файле. Подскажите, пожалуйста, что нужно изменить, чтобы он выводил все, независимо от значения. Вот кусок файла, который я пытаюсь распарсить: "1695668019,NULL,26643982,Balance,0.01,0.00,0.00000,0.00000,1695668019,0.00,0.00,0.00,250.00,0,82GR44TF5M2PJKZX 1695668865,GBPUSD,26644477,buy,0.01,1.22171,0.00000,1.21746,1695899697,1.21684,-0.05,-0.15,-4.87,202309,GBPUSDTsunami BUY (202309) #0 1695726000,GBPUSD,26661159,buy,0.02,1.21732,0.00000,1.21746,1695899696,1.21683,-0.09,-0.25,-0.98,202309,GBPUSDTsunami BUY (202309) #1 1695801600,GBPUSD,26697358,buy,0.04,1.21470,0.00000,1.21751,1695818888,1.21489,-0.18,0.00,0.76,202309,GBPUSDTsunami BUY (202309) #2" Первая строчка не выводится вообще... Здесь пример: https://profitea.ru/?do=testcsv
Ответить
Здравствуйте, Михаил! Не дождался вашего ответа... Исправление для предыдущего комментария: Обнаружил (проводил различные эксперименты), что парсер не выводит первую строку из csv файла, а не строки с нулевыми значениями. В связи с этим изменяю свой вопрос: Что и где нужно поправить, чтобы парсер выводил все строки из csv файла? Заранее благодарю за помощь и поддержку!
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.