X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fcsv.php;fp=www%2Fecrire%2Finc%2Fcsv.php;h=2f52bfd283242674171eebe092a2e4266127eed3;hb=a33c2ba9d919664b3bb0f565f8e9a8b9d8530cdb;hp=0000000000000000000000000000000000000000;hpb=8945248b3d948385798d9aa355c70e7089aca2b3;p=lhc%2Fweb%2Fclavette_www.git diff --git a/www/ecrire/inc/csv.php b/www/ecrire/inc/csv.php new file mode 100644 index 0000000..2f52bfd --- /dev/null +++ b/www/ecrire/inc/csv.php @@ -0,0 +1,90 @@ + $pvirg) + { $sep = ','; $hs = ',';} + else { $sep = ';'; $hs = ';'; $virg = $pvirg;} + if ($tab > $virg) {$sep = "\t"; $hs = "\t";} + + $t = preg_replace('/\r?\n/', "\n", + preg_replace('/[\r\n]+/', "\n", $t)); + // un separateur suivi de 3 guillemets attention ! + // attention au ; suceptible d'etre confondu avec un separateur + // on substitue un # et on remplacera a la fin + $t = preg_replace("/([\n$sep])\"\"\"/",'\\1""#',$t); + $t = str_replace('""','"#',$t); + preg_match_all('/"[^"]*"/', $t, $r); + foreach($r[0] as $cell) + $t = str_replace($cell, + str_replace($sep, $hs, + str_replace("\n", "
", + substr($cell,1,-1))), + $t); + list($entete, $corps) = explode("\n",$t,2); + $caption = ''; + // sauter la ligne de tete formee seulement de separateurs + if (substr_count($entete, $sep) == strlen($entete)) { + list($entete, $corps) = explode("\n",$corps,2); + } + // si une seule colonne, en faire le titre + if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) { + $caption = "\n||" . $l[1] . "|"; + list($entete, $corps) = explode("\n",$corps,2); + } + // si premiere colonne vide, le raccourci doit quand meme produire 0 + AND preg_match("/^$sep*$/", $lignes[count($lignes)-1])) + unset($lignes[count($lignes)-1]); + // calcul du nombre de colonne a chaque ligne + $nbcols = array(); + $max = $mil = substr_count($entete, $sep); + foreach($lignes as $k=>$v) { + if ($max <> ($nbcols[$k]= substr_count($v, $sep))) { + if ($max > $nbcols[$k]) + $mil = $nbcols[$k]; + else { $mil = $max; $max = $nbcols[$k];} + } + } + // Si pas le meme nombre, cadrer au nombre max + if ($mil <> $max) + foreach($nbcols as $k=>$v) { + if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v); + } + // et retirer les colonnes integralement vides + while(true) { + $nbcols = ($entete[strlen($entete)-1]===$sep); + foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep); + if (!$nbcols) break; + $entete = substr($entete,0,-1); + foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1); + } + + foreach($lignes as &$l) { + $l = explode($sep, $l); + } + return array(explode($sep, $entete), $lignes); +} + + +?>