Fonction fputcsv en PHP4
CrazyCat » 07/ 08/2009 14:53
PHP
|
Envoyer à un ami |
Fil des commentaires de ce billet
Alors que la fonction fgetcsv existe en PHP4 et en PHP5, la fonction fputcsv n'existe qu'en PHP5, ce qui est fort dommage lorsqu'on veut travailler avec des fichiers d'exports ou bien lorsqu'on veut avoir un script utilisable sur la plupart des serveurs sans connaitre leur version de PHP.
Détail de la fonction
La fonction fputscv prends 4 arguments, dont deux sont optionnels:
int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )
- $handle est le pointeur de fichier,
- $fields est le tableau des champs à insérer,
- $delimiter est le caractère de séparation des champs (',' par défaut)
- $enclosure est le caractère d'encadrement ('"' par défaut). Il n'est utilisé que si la valeur contient un caractère particulier qui est soit le délimiteur, soit le caractère d'encadrement soit un caractère non-imprimable (tabulation, retour à la ligne, nouvelle ligne).
Le retour est soit la longueur de la chaîne écrite, soit false en cas d'erreur.
Code source
<?php if (!function_exists('fputcsv')) { function fputcsv( &$handle, $fields, $delimiter=',', $enclosure='"') { $sts = false; $escape_char = '\\'; $arr = array(); // Gestion des erreurs if (!is_resource($handle)) { // $handle n'est pas une ressource valable trigger_error('fputcsv() expects parameter 1 to be resource, ' . gettype($handle) . ' given', E_USER_WARNING); return $sts; } if ($delimiter!=NULL) { if( strlen($delimiter) < 1 ) { // Le délimiteur n'est pas un caractère valide trigger_error('delimiter must be a character', E_USER_WARNING); return $sts; }elseif( strlen($delimiter) > 1 ) { // Le délimiteur est une chaîne trigger_error('delimiter must be a single character', E_USER_NOTICE); } $delimiter = $delimiter[0]; } if($enclosure!=NULL) { if( strlen($enclosure) < 1 ) { // L'encadrement n'est pas un caractère valide trigger_error('enclosure must be a character', E_USER_WARNING); return $sts; }elseif( strlen($enclosure) > 1 ) { // L'encadrement est une chaîne trigger_error('enclosure must be a single character', E_USER_NOTICE); } $enclosure = $enclosure[0]; } // Partie active foreach($fields as $field) { if (preg_match('!('.$delimiter.'|'.$enclosure.'|\n|\r|\t| )!', $field)) { // Le champ contient un caractère à protéger $strtmp = $enclosure; $escaped = false; for( $i=0; $i<strlen($field); $i++) { if($field[$i] == $escape_char) $escaped = true; elseif(!$escaped && $value[$i] == $enclosure) $strtmp .= $enclosure; else $escaped = false; $strtmp .= $field[$i]; } $strtmp .= $enclosure; $arr[] = $strtmp; } else { $arr[] = $field; } } // Création de la chaîne et copie dans le fichier $str = implode($delimiter, $arr); if (fwrite($handle, $str.chr(13).chr(10))) $sts = strlen($str); return $sts; } } ?>
Utilisation de la fonction
Il suffit ensuite de passer à la fonction un tableau contenant les divers éléments constituant la ligne
<?php $list = array ( 'a;aa,bb/b,ccc,dddd', '123,456,789', '"aaa","bbb"' ); $fp = fopen('test.csv', 'w'); foreach ($list as $line) { fputcsv($fp, split(',', $line), ";", "'"); } fclose($fp); ?>
Cet exemple donnera le résultat suivant:
'a;aa';bb/b;ccc;dddd 123;456;789 "aaa";"bbb"