@Σε αυτήν την ανάρτηση, θα δούμε πώς να χρησιμοποιήσετε τις ενσωματωμένες λειτουργίες της PHP για να διαβάζετε και να εκτυπώνετε τα περιεχόμενα ενός αρχείου CSV και να το μετατρέπετε σε ένα πίνακα. Θα χρησιμοποιήσουμε τις συναρτήσεις fopen() και fgetcsv() για να διαβάσουμε τα περιεχόμενα ενός αρχείου CSV και, στη συνέχεια, θα το μετατρέψουμε σε πίνακα χρησιμοποιώντας τις συναρτήσεις array_map() και str_getcsv().
Η αποθήκευση αρχείων δεδομένων σε μορφή τιμών διαχωρισμένων με κόμματα (CSV) δεν είναι κάτι νέο. Στην πραγματικότητα, είναι ένας από τους πιο συνηθισμένους τρόπους αποθήκευσης δεδομένων λόγω της απλότητάς του. Τα αρχεία CSV διαβάζονται και γράφονται εύκολα και μπορούν να ανοίξουν σε ένα βασικό πρόγραμμα επεξεργασίας κειμένου. Αυτός ο τύπος αρχείου αποθηκεύει δεδομένα σε πίνακα με τη μορφή απλού κειμένου.
Ένα παράδειγμα τέτοιου αρχείου θα μοιάζει με αυτό:
Παπαδοπούλου,40,νοσοκόμα
Στεργίου,45,γιατρός
Αποστόλου,50,νοσοκόμος
Αυτά τα δεδομένα αντιπροσωπεύουν πληροφορίες για τρία άτομα, με στήλες που αντιστοιχούν στα ονόματα, την ηλικία και την εργασία τους. Φυσικά, υπάρχει μια σειρά από πακέτα τρίτων που θα μπορούσαμε να χρησιμοποιήσουμε για να το πετύχουμε τη μετατροπή των CSV, αλλά η PHP έχει ενσωματωμένες εγγενείς λειτουργίες που λειτουργούν εξαιρετικά.
Εμφάνιση αρχείου CSV ως array
Σε αυτήν την ενότητα, θα διαβάσουμε ένα απλό αρχείο CSV που περιέχει μερικές λέξεις που χωρίζονται με το διαχωριστικό κόμμα. Για αρχή, θα χρησιμοποιήσουμε το απλό αρχείο που χρησιμοποιήσαμε παραπάνω, και στη συνέχεια μπορούμε να προχωρήσουμε στη χρήση ενός τυχαίου μεγαλύτερου αρχείου. Φυσικά, μπορείτε να δημιουργήσετε το δικό σας αρχείο χρησιμοποιώντας το Microsoft Excel ή ένα πρόγραμμα επεξεργασίας κειμένου και να το αποθηκεύσετε με την επέκταση CSV.
Για να διαβάσουμε το αρχείο, πρέπει πρώτα να το βρούμε στον φάκελο, στη θέση όπου είναι αποθηκευμένο. Για ευκολότερη πρόσβαση, μπορεί να θέλετε να το αποθηκεύσετε στον ίδιο φάκελο όπου έχετε το αρχείο του προγράμματός σας. Στη συνέχεια μπορούμε να χρησιμοποιήσουμε τη συνάρτηση fopen() συνάρτηση για να διαβάσουμε το αρχείο.
Στη συνέχεια, η συνάρτηση fgetcsv() ελέγχει για πεδία στο αρχείο CSV. Αυτή η συνάρτηση απαιτεί τρεις παραμέτρους: το όνομα του αρχείου που επιστρέφεται από fopen(), το μέγιστο μήκος της γραμμής προς ανάγνωση και τον ειδικό διαχωριστικό χαρακτήρα, τον οποίο αναφέρουμε ως "οριοθέτη". Αυτό μπορεί να είναι το κόμμα, η άνω τελεία ή οποιοδήποτε άλλο διαχωριστικό.
Τώρα ας γίνουμε πρακτικοί. Δημιουργήστε ένα αρχείο με το όνομα csvtable.php και αντιγράψτε τον παρακάτω κώδικα.
<?php
$file_to_read = fopen('data.csv', 'r');
if($file_to_read !== FALSE){
echo "<table>\n";
while(($data = fgetcsv($file_to_read, 100, ',')) !== FALSE){
echo "<tr>";
for($i = 0; $i < count($data); $i++) {
echo "<td>".$data[$i]."</td>";
}
echo "</tr>\n";
}
echo "</table>\n";
fclose($file_to_read);
}
?>
Στον κώδικα, η πρώτη πράξη είναι να ανοίξουμε το αρχείο data.csv, το οποίο θα πρέπει να περιέχει ορισμένα δεδομένα διαχωρισμένα με κόμματα. Η συνάρτηση fopen θα αναζητήσει αυτό το αρχείο στον ίδιο φάκελο με το csvtable.php. Η παράμετρος 'r' λέει στη συνάρτηση fopen να ανοίξει το αρχείο μόνο για ανάγνωση.
Εάν το αρχείο ανοίξει με επιτυχία, η fopen θα επιστρέψει ένα handle του αρχείου που μπορεί να χρησιμοποιηθεί για άλλες λειτουργίες ανάγνωσης. Διαφορετικά, θα επιστρέψει FALSE. Επομένως, ελέγχουμε ότι το handle του αρχείου δεν βρίσκεται σε κατάσταση FALSE πριν συνεχίσουμε να διαβάζουμε το αρχείο.
Στη συνέχεια η συνάρτηση fgetcsv() ανακτά τα πεδία CSV από το ανοιχτό αρχείο, μία γραμμή τη φορά. Λέμε στη συνάρτηση fgetcsv να διαβάσει το πολύ 100 χαρακτήρες ανά γραμμή και να χρησιμοποιήσει το διαχωριστικό "κόμμα" ως οριοθέτη. Στη συνέχεια, οι λέξεις που βρίσκονται στο αρχείο περνούν σε έναν πίνακα HTML.
Η τελευταία συνάρτηση είναι η fclose(), η οποία κλείνει το ανοιχτό αρχείο..
Τρέξτε το αρχείο csvtable .php μέσω του διακομιστή localhost ή εκτελέστε την εντολή php csvtable.php από τη γραμμή εντολών για να δείτε την ακόλουθη έξοδο:
Παπαδοπούλου 40 νοσοκόμα
Στεργίου 45 γιατρός
Αποστόλου 50 νοσοκόμος
Το πρώτο μέρος αυτού που έπρεπε να πετύχουμε έχει ήδη γίνει! Τώρα, θα προχωρήσουμε στη μετατροπή των ακατέργαστων πεδίων CSV σε πίνακα.
Υπάρχουν περισσότεροι από ένας τρόποι για την παραγωγή του πίνακα. Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση fgetcsv() για να μετατρέψουμε αυτόματα τα περιεχόμενα του αρχείου CSV σε πίνακα ή μπορούμε να χρησιμοποιήσουμε το array_map.
Χρήση της fgetcsv() για τη μετατροπή ενός αρχείου CSV σε πίνακα
Δημιουργήστε ένα αρχείο PHP με τα ακόλουθα περιεχόμενα:
<?php
function csvToArray($csvFile){
$file_to_read = fopen($csvFile, 'r');
while (!feof($file_to_read) ) {
$lines[] = fgetcsv($file_to_read, 1000, ',');
}
fclose($file_to_read);
return $lines;
}
//read the csv file into an array
$csvFile = 'data.csv';
$csv = csvToArray($csvFile);
//render the array with print_r
echo '<pre>';
print_r($csv);
echo '</pre>';
?>
Στον παραπάνω κώδικα, δημιουργήσαμε μια συνάρτηση για την ανάγνωση ενός αρχείου CSV και τη μετατροπή του σε πίνακα. Περνάμε σε μια παράμετρο το όνομα και τη διαδρομή του αρχείου - εγγράφου CSV. Στη συνέχεια, χρησιμοποιούμε τη feof() συνάρτηση για να ελέγξουμε αν έχει φτάσει το τέλος του αρχείου. Μέχρι να γίνει, πρέπει να αναλύσουμε τα πεδία CSV χρησιμοποιώντας τη fgetcsv(), όπως κάναμε στο παραπάνω παράδειγμα. Τα αναλυμένα πεδία CSV από το αρχείο CSV μετατρέπονται σε πίνακα χρησιμοποιώντας τη συνάρτηση fgetcsv() και προστίθενται ένα κάθε φορά στη μεταβλητή $lines[]. Τέλος, μην ξεχάσετε να χρησιμοποιήσετε τη συνάρτηση fclose() για να κλείσετε το ανοιχτό αρχείο.
Στη συνέχεια καλούμε τη συνάρτηση csvToArray, η οποία μεταβιβάζει το αρχείο CSV ως παράμετρο, και στη συνέχεια, τα περιεχόμενα του αρχείου CSV εμφανίζονται ως Array.
Χρήση array_map()για την ανάγνωση ενός αρχείου CSV
Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τη συνάρτηση array_map() για να μετατρέψετε ένα αρχείο CSV σε array. Για να το κάνετε αυτό, θα χρησιμοποιήσετε τη συνάρτηση str_getcsv ως συνάρτηση callback.
Μια συνάρτηση callback είναι κάποιος εκτελέσιμος κώδικας που μεταβιβάζεται σε άλλο κομμάτι κώδικα ως όρισμα. Αυτό το όρισμα αναμένεται να επανακληθεί αργότερα από τον κώδικα στον οποίο μεταβιβάζεται.
<?php
$csv = array_map('str_getcsv', file('data.csv'));
echo '<pre>';
print_r($csv);
echo '</pre>';
?>
Ο παραπάνω κώδικας χρησιμοποιεί τη file() μέθοδο για την ανάγνωση του αρχείου CSV σε έναν πίνακα γραμμών. Στη συνέχεια, καλεί τη συνάρτηση str_getcsv() σε κάθε γραμμή και αποθηκεύει τα δεδομένα για ολόκληρο το αρχείο στο $csv. Η str_getcsv() συνάρτηση αναλύει τα περιεχόμενα του πεδίου CSV κάθε γραμμής σε έναν πίνακα. Η έξοδος του παραπάνω αποσπάσματος κώδικα θα είναι η ίδια όπως παραπάνω. Παρατηρήστε, όμως, πόσο λιγότερος κωδικός απαιτείται.