wyświetlanie zawartości plików CSV

Wyświetlanie zawartości pliku CSV na stronie internetowej [PHP]

Czas czytania: 4 minut

Dzisiaj pokażę wam jak w miarę prosty sposób wyświetlić zawartość pliku zapisanego w formacie CSV na stronie internetowej.

Zapewne w tym momencie część z was zastanawia się po co w ogóle to robić. Bo czy nie szybciej jest przykleić zawartość takiego pliku. O tuż nie koniecznie. W praktyce zależy to bowiem od jego długości. Poza tym na format CSV możemy także zamieniać inne pliki (np. ODS, XLSX, XLS ) tworząc z nich tym samym bardzo prostą plikową bazę danych.

Co nam właściwie będzie potrzebne

Jak wskazuje już sam tytuł plik, który umożliwi nam odczyt, wczytanie zawartości pliku na stronę wykonamy w PHP. Nie mówimy tu o bardzo skomplikowanym skrypcie więc bez paniki. Po tym, krótkim wstępie bierzemy się do pracy.

Na początek potrzebujemy mieć plik CSV (zakładam, że część z czytających ten plik już posiada). Warto by był on zapisany z kodowaniem UTF-8. Kodowanie to jest stosowane na większości polsko języcznych stron internetowych. Zapisując w niektórych edytorach trzeba bardzo na to uważać w przeciwnym razie zamiast polskich liter pokażą się dziwne znaczki.

Przykładowo w libreoffice podczas zapisu trzeba zaznaczyć “Edycja ustawień filtra” by móc zmienić kodowanie pliku

Edycja ustawień filtra w libreoffice
Edycja ustawień filtra w libreoffice
zapis pliku CSV w UTF-8
zapis pliku CSV w kodowaniu UTF-8

Następnie przyda nam się localhost (np. Xampp) i edytor plików (zwykły notatnik raczej odpada, polecam np. Node++). Ewentualnie możecie skorzystać z serwera FTP (chociaż to trochę wydłuży czas pracy). Serwer jest nam niezbędny ponieważ będziemy w kolejnych krokach korzystać z PHP. Jeżeli macie już to wszystko to przechodzimy do kolejnego kroku czyli napisania krótkiego skryptu.

Na potrzeby tego wpisu pokażę wam 3 warianty odczytu pliku. A więc do działa.

Budowa podstawy dla witryny www

Budowę skryptu zaczniemy od zbudowania prostej stronki w języku HTML. Będzie nam ona potrzebna by później poprawnie odczytać plik. A i oczywiście plik zapisujemy z końcówką .PHP a nie .HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
  <div>

   <!-- Miejsce na kod PHP -->

  </div>
</body>
</html> 

W tym kodzie nie ma nic specjalnie ciekawego, ogólnie równie dobrze może za podstawę posłużyć podstrona waszego serwisu. Więc go nie będę omawiać.

Wypisywanie zawartości pliku CSV jeden pod drugim

Zaczniemy może po prostu od wypisania całej zawartości pliku. W programach takich jak Excel plik ten powinien otworzyć się w formie „tabeli”. My to jednak tutaj zmienimy i zamiast wypisywać w tej formie wypiszemy wszystkie elementy jeden pod drugim.

<?php
if (($handle = fopen("twoj-plik.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000000, ",")) !== FALSE) {
        $num = count($data);
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        } 
    }
    fclose($handle);
}
?>

Kod w dużym uproszczeniu:

Jak widać użyłam tutaj funkcji fopen() to za jej pomocą określimy o jaki plik nam chodzi i udostępnimy go do dalszej obróbki. Tak więc mamy w niej nazwę naszego pliku a zaraz za nią literkę “r”. Stanowi ona formę informacji, że jedynie będziemy otwierać plik w do odczytu. Czyli między innymi do wyświetlenia i przeglądania zawartości. Jednoczesne nasza funkcja znajduje się w zapytaniu “if” co powoduje, że w przypadku gdy nie ma pliku operacja nie wykona się. Konkretnie dostaniemy komunikat o błędzie.

Dalej mamy pętlę while i tu zaczyna się właściwie wczytanie zawartości pliku. Czyli z pomocą fgetcsv() otwieramy plik dodany do skryptu z funkcją fopen() i wczytujemy jego zawartość. W tym miejscu dość istotne jest to jak w pliku CSV zapisany, oznaczony został koniec rzędu. W tym przykładzie zakładamy, że jest to “,” przecinek. Zdarza się jednak, że może to być np. średnik. W takim przypadku trzeba to skorygować.

Kolejne etapy skryptu prowadzą nas już do wypisania zawartości.

$num = count($data); // ilość kolumn w pliku

echo $data[$c] . “<br />\n”; // wypisanie elementu

$c również pełni rolę licznika wskazuje on na numer elementu do wyświetlenia

Na koniec nie zapomnijcie o funkcji fclose, która „zamyka jak gdyby plik”.

Do usunięcia pustych pól przyda wam się z kolei:

if ($data[$c] != NULL){
  echo $data[$c] . "<br />\n";
}

Wyświetlanie zawartości w tabeli

A teraz poniżej macie sposób na wyświetlenie zawartości pliku w tabeli:

<table>
<?php
if (($handle = fopen("twoj-plik.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000000, ",")) !== FALSE) {
        $num = count($data);
      echo "<tr>";
        for ($c=0; $c < $num; $c++) {
            echo "<td>" . $data[$c] . "</td>";
        } 
		echo "</tr>";
    }
    fclose($handle);
}
?>
</table>

Tym razem zawartość pliku powinna zostać wyświetlona w formie tabeli.

Wypisywanie określonych kolumn

Teraz pokaże wam jak wypisać jedynie określone elementy.

<?php
if (($handle = fopen("twoj-plik.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000000, ",")) !== FALSE) {
            echo "<h2>" . $data[1] . "</h2>";
            echo "<p>" . $data[2] . "<br />\n";
            echo $data[3] . "</p>";
    }
    fclose($handle);
}
?>

Jak widać pierwszy element umieściłam w nagłówku <h2> a resztę wyświetlanego tekstu w <p>. Dzięki takiej zabawie będzie to wyglądać jak obrobiona treść strony. Czyli jest to dobry punkt wyjścia do bardzo prostego CMS z bazą plikową.


Warto przeczytać:

https://www.php.net/manual/en/function.fgetcsv.php