str_getcsv()
Apprenez la fonction PHP str_getcsv() : syntaxe, paramètres, exemples, analyse CSV multiligne et pièges courants.
La fonction str_getcsv() analyse une seule ligne de texte CSV (valeurs séparées par des virgules) et retourne ses champs sous forme de tableau plat. C'est le pendant en mémoire de fgetcsv() : au lieu de lire une ligne depuis un descripteur de fichier ouvert, elle travaille sur une chaîne que vous avez déjà — une ligne collée depuis un formulaire, une ligne unique lue depuis une réponse API, ou un élément d'un tableau que vous avez découpé vous-même.
Parce que le CSV réel est plus complexe qu'il n'y paraît (les champs peuvent être entourés de guillemets, contenir des virgules, ou traverser le délimiteur), str_getcsv() est presque toujours le bon choix par rapport à un simple explode(',', $line), qui échoue sur toute virgule entre guillemets.
Syntaxe
str_getcsv(
string $string,
string $separator = ",",
string $enclosure = "\"",
string $escape = "\\"
): array| Paramètre | Requis | Description |
|---|---|---|
$string | Oui | La ligne CSV à analyser. |
$separator | Non | Le délimiteur de champ — un seul caractère. Par défaut ,. |
$enclosure | Non | Le caractère qui entoure les champs contenant le délimiteur, des guillemets ou des sauts de ligne. Par défaut ". |
$escape | Non | Le caractère d'échappement. Par défaut \. Passez "" pour désactiver l'échappement propriétaire de PHP (recommandé pour un CSV strictement conforme à la RFC 4180). |
La fonction retourne toujours un tableau. Un champ vide devient une chaîne vide (""); une ligne d'entrée entièrement vide retourne [null].
Exemple de base
Résultat :
Array
(
[0] => John
[1] => Doe
[2] => 25
)Chaque valeur séparée par une virgule devient un élément, indexé à partir de 0.
Champs entre guillemets et virgules intégrées
C'est là que str_getcsv() montre toute son utilité. Un champ entouré de guillemets doubles peut contenir le délimiteur sans provoquer de découpage :
<?php
$input = '"Doe, John","New York, NY",25';
$array = str_getcsv($input);
print_r($array);
?>Résultat :
Array
(
[0] => Doe, John
[1] => New York, NY
[2] => 25
)Les guillemets encadrants sont supprimés, et les virgules à l'intérieur sont conservées comme données. explode(',', $input) aurait produit à tort cinq éléments ici.
Utiliser un délimiteur et un délimiteur d'encadrement différents
De nombreux fichiers « CSV » sont en réalité séparés par des points-virgules ou des tabulations. Remplacez les deuxième et troisième arguments pour les adapter :
<?php
$input = "'Jane Doe';'Berlin';30";
$array = str_getcsv($input, ';', "'");
print_r($array);
?>Résultat :
Array
(
[0] => Jane Doe
[1] => Berlin
[2] => 30
)Pour une ligne séparée par des tabulations, utilisez "\t" comme séparateur.
Analyser une chaîne CSV multiligne
str_getcsv() analyse une ligne à la fois. Pour transformer un document CSV complet en lignes, découpez-le d'abord en lignes, puis faites passer chaque ligne dans la fonction. La combinaison avec array_map() permet de rester concis :
<?php
$csv = "name,city,age\nJohn,Boston,25\nJane,Berlin,30";
$rows = array_map('str_getcsv', explode("\n", $csv));
print_r($rows);
?>Résultat :
Array
(
[0] => Array
(
[0] => name
[1] => city
[2] => age
)
[1] => Array
(
[0] => John
[1] => Boston
[2] => 25
)
[2] => Array
(
[0] => Jane
[1] => Berlin
[2] => 30
)
)Remarque :
explode("\n", ...)est un découpage simple. Si votre fichier utilise des fins de ligne Windows (\r\n) ou si des champs contiennent des sauts de ligne entre guillemets, préférez lire le fichier avecfgetcsv()dans une boucle, qui gère ces cas nativement.
Associer les lignes à un en-tête
Un schéma courant consiste à utiliser la première ligne comme clés et à construire des tableaux associatifs avec array_combine() :
<?php
$lines = ['name,city,age', 'John,Boston,25', 'Jane,Berlin,30'];
$header = str_getcsv(array_shift($lines));
$people = [];
foreach ($lines as $line) {
$people[] = array_combine($header, str_getcsv($line));
}
print_r($people[0]);
?>Résultat :
Array
(
[name] => John
[city] => Boston
[age] => 25
)Pièges courants
- Une seule ligne à la fois. Passer une chaîne multiligne traite l'ensemble comme un seul enregistrement ; découpez donc toujours en lignes avant d'analyser.
- Le caractère d'échappement surprend. L'échappement
\par défaut de PHP n'est pas standard. Pour des données conformes à la RFC 4180 (où"est échappé en le doublant, soit""), passezescape: ""pour éviter que les barres obliques inverses soient absorbées. - Les nombres restent des chaînes. Chaque champ est retourné sous forme de chaîne (
"25", pas25). Effectuez un cast explicite lorsque vous avez besoin de vrais nombres. - Saut de ligne final. Une ligne lue avec un
\nfinal peut produire un dernier champ vide ; rognez l'entrée au préalable si nécessaire.
Fonctions associées
fgetcsv()— lire et analyser une ligne CSV directement depuis un descripteur de fichier.fputcsv()— écrire un tableau dans un fichier sous forme de ligne CSV (l'opération inverse).explode()— découper une chaîne par un délimiteur lorsqu'il n'y a pas de champs entre guillemets à gérer.file_get_contents()— charger un fichier CSV dans une chaîne à passer àstr_getcsv().