Extraire des infos d’un fichier CSV
Lorsque l’on travaille avec des outils qui génèrent ou brassent des données, on peut être amené à vouloir les exporter pour les importer ailleurs.
J’ai tendance à préférer les sorties XML qui permettent une flexibilité dans les champs sortis pour chaque entrée mais quand la table des données à exporter est connue (de taille fixe), je préfère un fichier CSV qui est généralement plus léger.
Cependant l’extraction des données ne se fait pas forcément sans heurts à cause des caractères spéciaux comme les retours à la ligne.
En flânant sur la documentation en ligne de PHP, j’ai cependant fait une chouette découverte au travers du code fourni par Ryan Rubley.
Cependant, lors de l’export de données, certains retours à la ligne ne voulaient pas se faire correctement.
En effet, ce n’étaient ni des CR (cariage return), ni des LF (line feed) identifiés respectivement par \r et \n en PHP mais des VT (vertical tab) dont j’ignorais l’existence (merci à Notepad++ de m’avoir montré ce caractère improbable).
J’ai donc ajouté une simple ligne au code susmentionné pour assimiler les VT en CR et le tour était joué.
Voici donc le code agrémenté de ma ligne:
-
//parse a CSV file into a two-dimensional array
-
//this seems as simple as splitting a string by lines and commas, but this only works if tricks are performed
-
//to ensure that you do NOT split on lines and commas that are inside of double quotes.
-
//match all the non-quoted text and one series of quoted text (or the end of the string)
-
//each group of matches will be parsed with the callback, with $matches[1] containing all the non-quoted text,
-
//and $matches[3] containing everything inside the quotes
-
‘/([^"]*)("((""|[^"])*)"|$)/s’, ‘parse_csv_quotes’, $str);
-
-
//remove the very last newline to prevent a 0-field array for the last line
-
‘/\n$/’, », $str);
-
-
//split on LF and parse each line with a callback
-
‘parse_csv_line’"\n", $str));
-
}
-
-
//replace all the csv-special characters inside double quotes with markers using an escape sequence
-
//anything inside the quotes that might be used to split the string into lines and fields later,
-
//needs to be quoted. The only character we can guarantee as safe to use, because it will never appear in the unquoted text, is a CR
-
//So we’re going to use CR as a marker to make escape sequences for CR, LF, Quotes, and Commas.
-
"\v", "\r""\r", "\rR""\n", "\rN"‘""’, "\rQ"‘,’, "\rC", $str);
-
-
//The unquoted text is where commas and newlines are allowed, and where the splits will happen
-
//We’re going to remove all CRs from the unquoted text, by normalizing all line endings to just LF
-
//This ensures us that the only place CR is used, is as the escape sequences for quoted text
-
‘/\r\n?/’, "\n", $matches[1]) . $str;
-
}
-
-
//split on comma and parse each field with a callback
-
‘parse_csv_field’‘,’, $line));
-
}
-
-
//restore any csv-special characters that are part of the data
-
"\rC", ‘,’"\rQ", ‘"’"\rN", "\n""\rR", "\r"
Plus d’informations sur ces caractères spéciaux peuvent être trouvées sur Wikipédia[EN]