Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

138 lines
4.3 KiB

  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Système de publication pour l'internet *
  4. * *
  5. * Copyright © avec tendresse depuis 2001 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
  9. * Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) {
  12. return;
  13. }
  14. include_spip('inc/charsets');
  15. /**
  16. * Based on an example by ramdac at ramdac dot org
  17. * Returns a multi-dimensional array from a CSV file optionally using the
  18. * first row as a header to create the underlying data as associative arrays.
  19. *
  20. * @param string $file Filepath including filename
  21. * @param bool $head Use first row as header.
  22. * @param string $delim Specify a delimiter other than a comma.
  23. * @param int $len Line length to be passed to fgetcsv
  24. * @return array or false on failure to retrieve any rows.
  25. */
  26. /**
  27. * Importer le charset d'une ligne
  28. *
  29. * Importe un texte de CSV dans un charset et le passe dans le charset du site (utf8 probablement)
  30. * Les CSV peuvent sous ms@@@ avoir le charset 'iso-8859-1', mais pasfois aussi 'windows-1252' :/
  31. *
  32. * @param mixed $texte
  33. * @param bool|string $definir_charset_source
  34. * false : ne fait rien
  35. * string : utilisera pour les prochains imports le charset indiqué
  36. * true : remet le charset d'import par défaut de la fonction
  37. * @return array
  38. */
  39. function importer_csv_importcharset($texte, $definir_charset_source = false) {
  40. // le plus frequent, en particulier avec les trucs de ms@@@
  41. static $charset_source = 'iso-8859-1';
  42. if ($definir_charset_source) {
  43. if ($definir_charset_source === true) {
  44. $charset_source = 'iso-8859-1';
  45. } else {
  46. $charset_source = $definir_charset_source;
  47. }
  48. }
  49. // mais open-office sait faire mieux, donc mefiance !
  50. if (is_utf8($texte)) {
  51. $charset = 'utf-8';
  52. } else {
  53. $charset = $charset_source;
  54. }
  55. return importer_charset($texte, $charset);
  56. }
  57. /**
  58. * enlever les accents des cles presentes dans le head,
  59. * sinon ca pose des problemes ...
  60. *
  61. * @param string $key
  62. * @return string
  63. */
  64. function importer_csv_nettoie_key($key) {
  65. return translitteration($key);
  66. }
  67. /**
  68. * Lit un fichier csv et retourne un tableau
  69. * si $head est true, la premiere ligne est utilisee en header
  70. * pour generer un tableau associatif
  71. *
  72. * @param string $file
  73. * @param bool $head
  74. * @param string $delim
  75. * @param string $enclos
  76. * @param int $len
  77. * @param string $charset_source
  78. * Permet de définir un charset source du CSV, si différent de utf-8 ou iso-8859-1
  79. * @return array
  80. */
  81. function inc_importer_csv_dist($file, $head = false, $delim = ',', $enclos = '"', $len = 10000, $charset_source = '') {
  82. $return = false;
  83. if (@file_exists($file)
  84. and $handle = fopen($file, 'r')) {
  85. if ($charset_source) {
  86. importer_csv_importcharset('', $charset_source);
  87. }
  88. if ($head) {
  89. $header = fgetcsv($handle, $len, $delim, $enclos);
  90. if ($header) {
  91. $header = array_map('importer_csv_importcharset', $header);
  92. $header = array_map('importer_csv_nettoie_key', $header);
  93. $header_type = array();
  94. foreach ($header as $heading) {
  95. if (!isset($header_type[$heading])) {
  96. $header_type[$heading] = "scalar";
  97. } else {
  98. $header_type[$heading] = "array";
  99. }
  100. }
  101. }
  102. }
  103. while (($data = fgetcsv($handle, $len, $delim, $enclos)) !== false) {
  104. $data = array_map('importer_csv_importcharset', $data);
  105. if ($head and isset($header)) {
  106. $row = array();
  107. foreach ($header as $key => $heading) {
  108. if ($header_type[$heading] == "array") {
  109. if (!isset($row[$heading])) {
  110. $row[$heading] = array();
  111. }
  112. if (isset($data[$key]) and strlen($data[$key])) {
  113. $row[$heading][] = $data[$key];
  114. }
  115. } else {
  116. $row[$heading] = (isset($data[$key])) ? $data[$key] : '';
  117. }
  118. }
  119. $return[] = $row;
  120. } else {
  121. $return[] = $data;
  122. }
  123. }
  124. if ($charset_source) {
  125. importer_csv_importcharset('', true);
  126. }
  127. }
  128. return $return;
  129. }