[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / csv.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 function analyse_csv($t)
16 {
17 $virg = substr_count($t, ',');
18 $pvirg = substr_count($t, ';');
19 $tab = substr_count($t, "\t");
20 if ($virg > $pvirg)
21 { $sep = ','; $hs = '&#44;';}
22 else { $sep = ';'; $hs = '&#59;'; $virg = $pvirg;}
23 if ($tab > $virg) {$sep = "\t"; $hs = "\t";}
24
25 $t = preg_replace('/\r?\n/', "\n",
26 preg_replace('/[\r\n]+/', "\n", $t));
27 // un separateur suivi de 3 guillemets attention !
28 // attention au ; suceptible d'etre confondu avec un separateur
29 // on substitue un # et on remplacera a la fin
30 $t = preg_replace("/([\n$sep])\"\"\"/",'\\1"&#34#',$t);
31 $t = str_replace('""','&#34#',$t);
32 preg_match_all('/"[^"]*"/', $t, $r);
33 foreach($r[0] as $cell)
34 $t = str_replace($cell,
35 str_replace($sep, $hs,
36 str_replace("\n", "<br />",
37 substr($cell,1,-1))),
38 $t);
39 list($entete, $corps) = explode("\n",$t,2);
40 $caption = '';
41 // sauter la ligne de tete formee seulement de separateurs
42 if (substr_count($entete, $sep) == strlen($entete)) {
43 list($entete, $corps) = explode("\n",$corps,2);
44 }
45 // si une seule colonne, en faire le titre
46 if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
47 $caption = "\n||" . $l[1] . "|";
48 list($entete, $corps) = explode("\n",$corps,2);
49 }
50 // si premiere colonne vide, le raccourci doit quand meme produire <th...
51 if ($entete[0] == $sep) $entete = ' ' . $entete;
52
53 $lignes = explode("\n", $corps);
54
55 // retrait des lignes vides finales
56 while(count($lignes) > 0
57 AND preg_match("/^$sep*$/", $lignes[count($lignes)-1]))
58 unset($lignes[count($lignes)-1]);
59 // calcul du nombre de colonne a chaque ligne
60 $nbcols = array();
61 $max = $mil = substr_count($entete, $sep);
62 foreach($lignes as $k=>$v) {
63 if ($max <> ($nbcols[$k]= substr_count($v, $sep))) {
64 if ($max > $nbcols[$k])
65 $mil = $nbcols[$k];
66 else { $mil = $max; $max = $nbcols[$k];}
67 }
68 }
69 // Si pas le meme nombre, cadrer au nombre max
70 if ($mil <> $max)
71 foreach($nbcols as $k=>$v) {
72 if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v);
73 }
74 // et retirer les colonnes integralement vides
75 while(true) {
76 $nbcols = ($entete[strlen($entete)-1]===$sep);
77 foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep);
78 if (!$nbcols) break;
79 $entete = substr($entete,0,-1);
80 foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1);
81 }
82
83 foreach($lignes as &$l) {
84 $l = explode($sep, $l);
85 }
86 return array(explode($sep, $entete), $lignes);
87 }
88
89
90 ?>