/***************************************************************************\
* 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", "<br />",
- 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 <th...
- if ($entete[0] == $sep) $entete = ' ' . $entete;
+ if ($entete[0] == $sep) {
+ $entete = ' ' . $entete;
+ }
$lignes = explode("\n", $corps);
// retrait des lignes vides finales
- while(count($lignes) > 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);
+}