X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fcsv.php;h=30f314925f2b8c9bf677abc41b0523cf336e5bb3;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=ae90101685518cf79cd6bcb434cd326ae5f54c8c;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/csv.php b/www/ecrire/inc/csv.php index ae901016..30f31492 100644 --- a/www/ecrire/inc/csv.php +++ b/www/ecrire/inc/csv.php @@ -3,88 +3,128 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +/** + * Analyse de fichiers CSV + * + * @package SPIP\Core\CSV + */ -function analyse_csv($t) -{ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +/** + * Retourne les données d'un texte au format CSV + * + * @param string $t + * Contenu du CSV + * @return array + * Tableau des données en 3 index : + * - Liste des noms des colonnes + * - Liste des valeurs de chaque ligne et chaque colonne + * - Titre du tableau (si une seule colonne) + **/ +function analyse_csv($t) { $virg = substr_count($t, ','); $pvirg = substr_count($t, ';'); $tab = substr_count($t, "\t"); - if ($virg > $pvirg) - { $sep = ','; $hs = ',';} - else { $sep = ';'; $hs = ';'; $virg = $pvirg;} - if ($tab > $virg) {$sep = "\t"; $hs = "\t";} + if ($virg > $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)); + 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); + $t = preg_replace("/([\n$sep])\"\"\"/", '\\1""#', $t); + $t = str_replace('""', '"#', $t); preg_match_all('/"[^"]*"/', $t, $r); - foreach($r[0] as $cell) + foreach ($r[0] as $cell) { $t = str_replace($cell, str_replace($sep, $hs, str_replace("\n", "
", - substr($cell,1,-1))), + substr($cell, 1, -1))), $t); - list($entete, $corps) = explode("\n",$t,2); + } + 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); + 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); + $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]); + while (count($lignes) > 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];} - } + 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); - } + 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); + 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) { + foreach ($lignes as &$l) { $l = explode($sep, $l); } - return array(explode($sep, $entete), $lignes); -} - -?> + return array(explode($sep, $entete), $lignes, $caption); +}