W ostatnim projekcie, nad którym mi przyszło pracować, potrzebowałem parsować oraz zapisywać pliki CSV. Pierwsze co zrobiłem, to przeszukałem packagist.org i mimo znalezienia co najmniej kilkunastu paczek, nie byłem z nich zadowolony. Wszystkie znalezione paczki można określić jednym słowem – toporne. Ja potrzebowałem czegoś prostego, co można dodać do projektu i korzystać bez zagłębiania się w dokumentację. I tak narodził się pomysł napisania prostej paczki do zapisywania i odczytywania plików CSV.

Aby skorzystać z paczki, należy ją wpierw zainstalować. W tym celu skorzystamy z composera.

composer require wilgucki/csv

Po instalacji paczki, musimy w pliku config/app.php dodać service provider.

'providers' => [
    //... 
    Wilgucki\Csv\CsvServiceProvider::class,
]

W tym samym pliku dodajemy fasady.

'aliases' => [
    //...
    'CsvReader' => Wilgucki\Csv\Facades\Reader::class,
    'CsvWriter' => Wilgucki\Csv\Facades\Writer::class,
]

Samo użycie jest bardzo proste. Zacznijmy od odczytu.

$reader = CsvReader::open('/path/to/file.csv');

Jeśli nasz plik csv ma inne ustawienia niż domyślne, możemy przekazać dodatkowe atrybuty do metody open. W ten sposób możemy ustawić inny znak rozdzielający, ogranicznik oraz znak ucieczki.

$reader = CsvReader::open('/path/to/file.csv', ';', '\'', '\\\\');

Po otwarciu pliku do odczytu, mamy dwie możliwości pobierania jego zawartości. Możemy odczytywać plik wiersz po wierszu

while (($line = $reader->readLine()) !== false) {
    print_r($line);
}

lub w całości

print_r($reader->readAll());

Jeśli plik CSV posiada w pierwszym wierszu nagłówek, możemy pobrać ten nagłówek przy pomocy metody getHeader. Oprócz zwrócenia nagłówka, metoda połączy kolejne kolumny nagłówka z kolejnymi wierszami w taki sposób, że wartość kolumny nagłówka stanie się kluczem tablicy z danymi.

$reader = CsvReader::open($file, ';');
$header = $reader->getHeader();
print_r($header);
print_r($reader->readAll());

Na koniec zamykamy plik

$reader->close();

Skoro wiemy już jak odczytywać pliki CSV, pora dowiedzieć się jak je zapisywać.

$writer = CsvWriter::create('/path/where/your/file/will/be/saved.csv');

Podobnie jak w przypadku metody open z klasy CsvReader mamy możliwość ustawienia innego znaku rozdzielającego, ogranicznika oraz znaku ucieczki. Jeśli podczas tworzenia pliku CSV nie podamy ścieżki do pliku, wówczas plik zostanie utworzony w pamięci.

Dane do pliku CSV możemy zapisać na dwa sposoby

$writer->writeLine(['some', 'data']);
$writer->writeLine(['another', 'line']);

$writer->writeAll([
    ['some', 'data'],
    ['another', 'line'],
]);

Do wyświetlenia danych zapisanych w pliku CSV, możemy użyć metody flush.

echo $writer->flush();

Na koniec zamykamy plik.

$writer->close();

Na chwilę obecną to wszystkie możliwości oferowane przez paczkę. W kolejnych wersjach pojawią się metody odpowiedzialne za zmianę kodowania zapisywanych i odczytywanych danych oraz możliwość bezpośredniego importowania oraz eksportowania danych między plikiem CSV a modelem.

Paczka dostępna jest pod adresem https://packagist.org/packages/wilgucki/csv.