source: spip-zone/_plugins_/iterateurs/inc/csv.php @ 43397

Last change on this file since 43397 was 43397, checked in by fil@…, 10 years ago

pas de boucle infinie sur un csv vide

File size: 3.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13
14function analyse_csv($t)
15{
16        $virg = substr_count($t, ',');
17        $pvirg = substr_count($t, ';');
18        $tab = substr_count($t, "\t");
19        if ($virg > $pvirg)
20                { $sep = ','; $hs = '&#44;';}
21        else    { $sep = ';'; $hs = '&#59;'; $virg = $pvirg;}
22        if ($tab > $virg) {$sep = "\t"; $hs = "\t";}
23
24        $t = preg_replace('/\r?\n/', "\n",
25                                      preg_replace('/[\r\n]+/', "\n", $t));
26        // un separateur suivi de 3 guillemets attention !
27        // attention au ; suceptible d'etre confondu avec un separateur
28        // on substitue un # et on remplacera a la fin
29        $t = preg_replace("/([\n$sep])\"\"\"/",'\\1"&#34#',$t);
30        $t = str_replace('""','&#34#',$t);
31        preg_match_all('/"[^"]*"/', $t, $r);
32        foreach($r[0] as $cell)
33                $t = str_replace($cell,
34                        str_replace($sep, $hs,
35                                str_replace("\n", "<br />",
36                                            substr($cell,1,-1))),
37                        $t);
38        list($entete, $corps) = explode("\n",$t,2);
39        $caption = '';
40        // sauter la ligne de tete formee seulement de separateurs
41        if (substr_count($entete, $sep) == strlen($entete)) {
42                list($entete, $corps) = explode("\n",$corps,2);
43        }
44        // si une seule colonne, en faire le titre
45        if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
46                        $caption = "\n||" .  $l[1] . "|";
47                        list($entete, $corps) = explode("\n",$corps,2);
48        }
49        // si premiere colonne vide, le raccourci doit quand meme produire <th...
50        if ($entete[0] == $sep) $entete = ' ' . $entete;
51
52        $lignes = explode("\n", $corps);
53
54        // retrait des lignes vides finales
55        while(count($lignes) > 0
56        AND preg_match("/^$sep*$/", $lignes[count($lignes)-1]))
57          unset($lignes[count($lignes)-1]);
58        //  calcul du  nombre de colonne a chaque ligne
59        $nbcols = array();
60        $max = $mil = substr_count($entete, $sep);
61        foreach($lignes as $k=>$v) {
62          if ($max <> ($nbcols[$k]= substr_count($v, $sep))) {
63            if ($max > $nbcols[$k])
64              $mil = $nbcols[$k];
65            else { $mil = $max; $max = $nbcols[$k];}
66          }
67        }
68        // Si pas le meme nombre, cadrer au nombre max
69        if ($mil <> $max)
70          foreach($nbcols as $k=>$v) {
71            if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v);
72            }
73        // et retirer les colonnes integralement vides
74        while(true) {
75          $nbcols =  ($entete[strlen($entete)-1]===$sep);
76          foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep);
77          if (!$nbcols) break;
78          $entete = substr($entete,0,-1);
79          foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1);
80        }
81
82        foreach($lignes as &$l) {
83                $l = explode($sep, $l);
84        }
85        return array(explode($sep, $entete), $lignes);
86}
87
88
89?>
Note: See TracBrowser for help on using the repository browser.