3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Analyse de fichiers CSV
16 * @package SPIP\Core\CSV
19 if (!defined('_ECRIRE_INC_VERSION')) {
24 * Retourne les données d'un texte au format CSV
29 * Tableau des données en 3 index :
30 * - Liste des noms des colonnes
31 * - Liste des valeurs de chaque ligne et chaque colonne
32 * - Titre du tableau (si une seule colonne)
34 function analyse_csv($t) {
35 $virg = substr_count($t, ',');
36 $pvirg = substr_count($t, ';');
37 $tab = substr_count($t, "\t");
51 $t = preg_replace('/\r?\n/', "\n",
52 preg_replace('/[\r\n]+/', "\n", $t));
53 // un separateur suivi de 3 guillemets attention !
54 // attention au ; suceptible d'etre confondu avec un separateur
55 // on substitue un # et on remplacera a la fin
56 $t = preg_replace("/([\n$sep])\"\"\"/", '\\1""#', $t);
57 $t = str_replace('""', '"#', $t);
58 preg_match_all('/"[^"]*"/', $t, $r);
59 foreach ($r[0] as $cell) {
60 $t = str_replace($cell,
61 str_replace($sep, $hs,
62 str_replace("\n", "<br />",
63 substr($cell, 1, -1))),
66 list($entete, $corps) = explode("\n", $t, 2);
68 // sauter la ligne de tete formee seulement de separateurs
69 if (substr_count($entete, $sep) == strlen($entete)) {
70 list($entete, $corps) = explode("\n", $corps, 2);
72 // si une seule colonne, en faire le titre
73 if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) {
74 $caption = "\n||" . $l[1] . "|";
75 list($entete, $corps) = explode("\n", $corps, 2);
77 // si premiere colonne vide, le raccourci doit quand meme produire <th...
78 if ($entete[0] == $sep) {
79 $entete = ' ' . $entete;
82 $lignes = explode("\n", $corps);
84 // retrait des lignes vides finales
85 while (count($lignes) > 0
86 and preg_match("/^$sep*$/", $lignes[count($lignes) - 1])) {
87 unset($lignes[count($lignes) - 1]);
89 // calcul du nombre de colonne a chaque ligne
91 $max = $mil = substr_count($entete, $sep);
92 foreach ($lignes as $k => $v) {
93 if ($max <> ($nbcols[$k] = substr_count($v, $sep))) {
94 if ($max > $nbcols[$k]) {
102 // Si pas le meme nombre, cadrer au nombre max
104 foreach ($nbcols as $k => $v) {
106 $lignes[$k] .= str_repeat($sep, $max - $v);
110 // et retirer les colonnes integralement vides
112 $nbcols = ($entete[strlen($entete) - 1] === $sep);
113 foreach ($lignes as $v) {
114 $nbcols &= ($v[strlen($v) - 1] === $sep);
119 $entete = substr($entete, 0, -1);
120 foreach ($lignes as $k => $v) {
121 $lignes[$k] = substr($v, 0, -1);
125 foreach ($lignes as &$l) {
126 $l = explode($sep, $l);
129 return array(explode($sep, $entete), $lignes, $caption);