Odczyt pliku CSV w PHP: parsowanie

Odczyt CSV w PHP

Pliki CSV (z ang. Comma-Separated Values) to zwykłe plik tekstowe, zawierające listę danych.

Pliki te są często używane do wymiany danych między różnymi aplikacjami. Na przykład bazy danych mogą importować i eksportować dane właśnie w postaci plików CSV. Do tego popularne aplikacje, przechowujące jakiekolwiek dane, najczęściej posługują się plikami CSV właśnie do importu i eksportu.

Z racji, że bardzo duża część aplikacji internetowych tworzona jest w PHP, nie mogło w nim zabraknąć wbudowanych funkcji do odczytu i parsowania plików CSV.

Zanim przejdziemy do odczytu CSV przez PHP, zobaczmy najpierw, jak wygląda struktura pliku CSV.

Struktura plików CSV

Plik CSV ma dość prostą strukturę.

To lista danych oddzielonych przecinkami.

Przeważnie to właśnie przecinki są używane do oddzielenia danych, jednak czasami korzysta się z innych znaków, takich jak np. średniki. Jeśli eksportowane dane zawierają pełne zdania wraz z interpunkcją (w tym przecinkami), często zastosowanie średników usprawnia odczyt tych danych i zmniejsza rozmiar pliku.

OK, to jak wygląda przykładowy plik CSV?

Załóżmy na przykład, że masz tabelę użytkowników i eksportujesz ją do pliku CSV.

Otrzymasz plik zawierający taki tekst:

id,name,email,passwordHash
1,Marcin Wesel,marcin@kursphp.com,XXYYZZ
2,Marcin Testowy,test@test.com,XXXXXX

To wszystko, czym naprawdę jest plik CSV.

Oczywiście, sama zawartość pliku może być bardziej skomplikowana i może zawierać tysiące linijek, więcej wpisów w każdym wierszu lub długie teksty (ze spacjami, kropkami itp.). Niektóre pliki CSV mogą nawet nie mieć nagłówków u góry (jeśli z góry wiadomo, jaka jest kolejność danych lub aplikacja pozwala na ręczne dopasowanie kolumn).

Jednak tak wygląda podstawowy format.

Plik CSV to czysta prostota.

Są sposobem na łatwe eksportowanie danych i importowanie ich do innych programów. Wynikowe dane są czytelne i dla człowieka i dla maszyny. Można je łatwo przeglądać za pomocą edytorów tekstu lub programów do obsługi arkuszy kalkulacyjnych (jak Microsoft Excel czy Applowski Numbers).

Można je również bardzo szybko skonwertować na samodzielny arkusz kalkulacyjny.

Odczyt pliku CSV w PHP

Odczytu pliku CSV dokonuje się w dokładnie ten sam sposób, co każdego innego pliku.

Na temat odczytywania pliku z wykorzystaniem PHP znajdziesz masę informacji tutaj: Odczyt pliku w PHP. Na potrzeby tego tutoriala skorzystamy sobie z funkcji file.

<?php
$content= file('file.csv');
$csv = array();
foreach ($content as $line) {
        $csv[] = str_getcsv($line);
    }

var_dump($csv);

Ten krótki skrypt otwiera plik file.csv i przypisuje jego zawartość do zmiennej $content. Następnie, po zadeklarowaniu tablicy $csv, przechodzi pętlą foreach po wszystkich odczytanych linijkach i każdą z nich parsuje funkcją str_getcsv.

Funkcja str_getcsv w PHP

To właśnie funkcja str_getcsv jest odpowiedzialna za podzielenie wiersza na poszczególne kolumny. Może przyjąć dodatkowe argumenty:

  1. Delimiter – znak rozdzielenia danych (domyślnie jest to przecinek, ale możesz wstawić średnik czy inny separator).
  2. Enclousure – znaki opakowujące dane (jak np. cudzysłów).
  3. Escape – sekwencja znaków, która sprawi, że następny znak nie jest traktowany jak separator czy enclosure (np. gdy chcesz potraktować dany przecinek jako fragment danej, a nie oddzielenie).

Rezultatem jej działania jest tablica z konkretnymi danymi, pozbawiona oddzielających przecinków czy otaczających cudzysłowów.

Wyświetlenie danych z CSV

Teraz, gdy odczytaliśmy dane do zmiennej w PHP, możemy je łatwo wyświelić.

Skorzystam sobie z klasycznej tabelki HTML, którą możesz dopalić Bootstrapem. Wystarczy dodać jedną z klas dostępnych na oficjalnej stronie Bootstrapa.

Następnie potraktuję pierwszy wiersz jako nagłówki tabeli, a całą resztę jako moje dane:

        <table class="table">
        <thead>
          <tr>
        <?php foreach (array_shift($csv) as $title) : ?>
            <th><?=$title?></th>
        <?php endforeach; ?>
        </thead>
        <tbody>
        <?php foreach ($csv as $record) : ?>
            <tr>
            <?php foreach ($record as $data) : ?>
                <td><?=$data?></td>
            <?php endforeach; ?>
            </tr>
        <?php endforeach; ?>
        </tbody>

W efekcie działania tego skryptu dostaniesz ładną tabelkę, uzupełnioną danymi odczytanymi z pliku CSV.

Jak wrażenia?

Koniecznie zostaw komentarz i daj znać, czy zadziałało.