Jak odczytać lub zapisać plik CSV w PHP?

0
162
Rate this post

Praca z plikami CSV jest jednym z podstawowych zadań, z którymi programiści mogą się spotkać podczas tworzenia aplikacji webowych w PHP. Pliki CSV (Comma-Separated Values) są szeroko stosowane w celu przechowywania i wymiany danych. W tym artykule omówimy, jak odczytywać i zapisywać pliki CSV za pomocą różnych metod w języku PHP.

Funkcje wbudowane

Odczytywanie pliku CSV

PHP oferuje kilka wbudowanych funkcji do odczytywania plików CSV, w tym fgetcsv(), która jest jedną z najprostszych i najbardziej efektywnych. Poniżej znajduje się przykładowy kod:

php
$handle = fopen("plik.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
echo $data[$c] . " ";
}
echo "\n";
}
fclose($handle);

Zapisywanie do pliku CSV

Do zapisywania danych w formie plików CSV używa się funkcji fputcsv(). Poniżej znajduje się przykładowy kod:

php
$lista = array(
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);

$handle = fopen('plik.csv', 'w');

foreach ($lista as $linia) {
fputcsv($handle, $linia);
}

fclose($handle);

Biblioteki zewnętrzne

Jeżeli potrzebujesz zaawansowanych funkcji, jak np. obsługa plików CSV z nagłówkami, różnymi formatami itd., warto rozważyć użycie bibliotek zewnętrznych, takich jak League\Csv.

Instalacja

Można ją zainstalować przy pomocy komendy:

bash
composer require league/csv

Odczytywanie za pomocą League\Csv

php
use League\Csv\Reader;

$csv = Reader::createFromPath('plik.csv', 'r');
$csv->setHeaderOffset(0);

foreach ($csv as $rekord) {
print_r($rekord);
}

Zapisywanie za pomocą League\Csv

php
use League\Csv\Writer;

$csv = Writer::createFromPath('plik.csv', 'w+');
$csv->insertOne(['nazwa', 'wiek']);
$csv->insertAll([
['Jan Kowalski', 25],
['Anna Nowak', 40]
]);

Przetwarzanie danych

Oprócz odczytu i zapisu plików CSV, często trzeba je też odpowiednio przetworzyć. Możesz na przykład użyć funkcji array_map czy array_filter do modyfikacji czy oczyszczania danych.

php
$handle = fopen("plik.csv", "r");
$zmodyfikowaneDane = [];

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$zmodyfikowaneDane[] = array_map(function($pole) {
return strtoupper($pole);
}, $data);
}

fclose($handle);

Następnie te zmodyfikowane dane można zapisać w nowym pliku CSV.

Bezpieczeństwo

Pamiętaj, że praca z plikami niesie ze sobą pewne ryzyko, dlatego zawsze upewnij się, że plik, który zamierzasz odczytać lub zapisać, istnieje i jest w odpowiednim formacie. Możesz to zrobić, używając różnych funkcji PHP, takich jak file_exists, is_readable i is_writable.

Optymalizacja

Jeżeli pracujesz z dużymi plikami, warto zastosować różne techniki optymalizacji, takie jak buforowanie czy stronicowanie danych, aby nie obciążać zbytnio pamięci serwera.

Obsługa błędów

Podczas odczytu i zapisu plików CSV mogą wystąpić różne błędy. Aby je wyłapać i odpowiednio zareagować, warto skorzystać z mechanizmów obsługi błędów w PHP, takich jak wyjątki (try-catch) czy funkcje error_reporting i set_error_handler.

Przykład z wyjątkami

php
try {
$handle = fopen("plik.csv", "r");
if (!$handle) {
throw new Exception('Nie można otworzyć pliku');
}

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// ... operacje na danych
}

fclose($handle);
} catch (Exception $e) {
echo 'Wystąpił błąd: ', $e->getMessage(), "\n";
}

Zastosowania praktyczne

Odczyt i zapis plików CSV w PHP ma wiele praktycznych zastosowań. Możesz na przykład użyć tego mechanizmu do importu i eksportu danych pomiędzy różnymi systemami, generowania raportów, czy nawet do stworzenia prostego systemu bazodanowego.

Import danych

Jeżeli masz dużą ilość danych zapisanych w pliku CSV, możesz je łatwo zaimportować do bazy danych MySQL przy użyciu PHP.

php
$handle = fopen("plik.csv", "r");
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$stmt = $pdo->prepare("INSERT INTO tabela (pole1, pole2) VALUES (?, ?)");
$stmt->execute($data);
}

fclose($handle);

Eksport danych

Odwrotnie, jeżeli potrzebujesz wyeksportować dane z bazy MySQL do pliku CSV, również można to zrobić w prosty sposób.

php
$pdo = new PDO("mysql:host=localhost;dbname=test", "username", "password");
$stmt = $pdo->prepare("SELECT * FROM tabela");
$stmt->execute();

$handle = fopen('plik.csv', 'w');

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
fputcsv($handle, $row);
}

fclose($handle);

Formatowanie danych

Warto również pamiętać o formatowaniu danych, które mają być zapisane w pliku CSV. Na przykład, liczby zmiennoprzecinkowe czy daty mogą być różnie interpretowane w zależności od ustawień regionalnych czy preferencji użytkownika. W PHP dostępne są różne funkcje, takie jak number_format czy date, które mogą być użyte do tego celu.

Testowanie i debugowanie

Przed wdrożeniem kodu na produkcję warto przetestować różne scenariusze, aby upewnić się, że kod działa poprawnie w każdych warunkach. Warto tu skorzystać z narzędzi do debugowania dostępnych w PHP, jak Xdebug, oraz zautomatyzowanych testów, np. przy użyciu PHPUnit.

Zastosowanie w praktycznych projektach

Odczyt i zapis plików CSV jest szczególnie użyteczny w praktycznych projektach, takich jak systemy zarządzania treścią (CMS), sklepy internetowe czy aplikacje do analizy danych. Możesz na przykład zintegrować funkcje odczytu i zapisu CSV w panelu administracyjnym, co pozwoli na szybki import i eksport danych.

Automatyzacja

W niektórych przypadkach, odczyt i zapis plików CSV może być częścią większej automatyzacji. Na przykład, możesz chcieć automatycznie generować pliki CSV z najnowszymi danymi każdego dnia i wysyłać je na określony adres email.

php
// Generowanie pliku CSV
$handle = fopen('plik.csv', 'w');
// ... zapis danych
fclose($handle);

// Wysyłanie emaila
$mail_to = "email@example.com";
$subject = "Najnowsze dane w pliku CSV";
$message = "Plik CSV z najnowszymi danymi jest w załączniku.";
$headers = "From: noreply@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"boundary\"\r\n";

$email_message = "--boundary\r\n";
$email_message .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n";
$email_message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$email_message .= $message . "\r\n";
$email_message .= "--boundary\r\n";
$email_message .= "Content-Type: application/octet-stream; name=\"plik.csv\"\r\n";
$email_message .= "Content-Disposition: attachment; filename=\"plik.csv\"\r\n";
$email_message .= "Content-Transfer-Encoding: base64\r\n\r\n";
$email_message .= base64_encode(file_get_contents('plik.csv')) . "\r\n";
$email_message .= "--boundary--";

mail($mail_to, $subject, $email_message, $headers);

Wersjonowanie i zarządzanie kodem

Jeśli pracujesz nad większym projektem, w którym odczyt i zapis plików CSV jest jednym z wielu elementów, warto korzystać z systemu kontroli wersji, takiego jak Git. Pozwoli to na łatwe śledzenie zmian i współpracę z innymi programistami.

Ograniczenia i wydajność

Kiedy pracujesz z bardzo dużymi plikami CSV, musisz zwrócić uwagę na wydajność i zużycie zasobów. Odczytywanie całego dużego pliku do pamięci może być nieefektywne i spowodować przekroczenie dostępnych zasobów. W takich przypadkach, zaleca się stosowanie strumieniowego odczytu danych oraz ograniczanie ilości przetwarzanych danych na raz.

Współpraca z innymi technologiami

Czasem konieczne może być korzystanie z plików CSV w połączeniu z innymi technologiami i narzędziami, jak na przykład JavaScript na froncie czy różne bazy danych. Możesz na przykład użyć AJAX do asynchronicznego odczytu pliku CSV i prezentowania danych użytkownikowi w bardziej interaktywny sposób.