CsvImport.class.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. class CsvImport{
  3. public $mime = 'application/csv';
  4. public $extension = 'csv';
  5. public $description = 'Fichier tableur générique';
  6. public $meta = array();
  7. /* convertis le fichier en tableau lignes / colonnes
  8. Le tableau final doit avoir la forme :
  9. array( <-- excel
  10. array( <-- ligne
  11. array( <-- cellule
  12. 'value' => '' <-- valeur cellule
  13. 'color' => '' <-- propriété optionelle "couleur" (ou autre)
  14. )
  15. )
  16. )
  17. */
  18. public function toArray($file){
  19. $stream = file_get_contents($file);
  20. $stream = utf8_encode($stream);
  21. //met a plat les lignes comportant un saut de ligne car entre ""
  22. $stream = preg_replace_callback('/"(.*)"/Uis', function($match){
  23. return str_replace(array("\n","\r"),'<br>',$match[1]);
  24. }, $stream);
  25. $finalArray = array();
  26. $emptyLines = 0;
  27. foreach(explode(PHP_EOL,$stream) as $line){
  28. //si + de 10 lignes vides on arrette de lire (evite les excels sans fin)
  29. if($this->emptyLine($line,true)) $emptyLines++;
  30. if($emptyLines>10) break;
  31. $finalLine = array();
  32. foreach(explode(';',$line) as $cell) $finalLine[]= array('value'=>$cell);
  33. $finalArray[] = $finalLine;
  34. }
  35. return $finalArray;
  36. }
  37. //vérifie si une ligne est a vide ou non
  38. public function emptyLine($line,$raw = false){
  39. if($raw) return str_replace(array(';',' ',"\t","\n","\r"),'',$line) == '';
  40. $oneFilled = false;
  41. foreach($line as $i=>$cell){
  42. if( $this->emptyCell($cell) ) continue;
  43. $oneFilled = true;
  44. break;
  45. }
  46. return !$oneFilled;
  47. }
  48. //vérifie si une cellule est a vide ou non
  49. public function emptyCell($cell){
  50. return str_replace(array(';',' ',"\t","\n","\r"),'',$cell['value']) == '';
  51. }
  52. //Déduction du type d'une celleule a partir de sa valeur
  53. public function cellType($headerCell,$valueCell){
  54. $columnName = isset($headerCell['label']) ? $headerCell['label'] : $headerCell['value'];
  55. $value = $valueCell['value'];
  56. $deductedType = 'text';
  57. if(strlen($value)>225) $deductedType = 'textarea';
  58. if(is_int($value)) $deductedType = 'number';
  59. if(is_float($value) || is_double($value)) $deductedType = 'decimal';
  60. if( strtolower($value) =='oui'
  61. || strtolower($value) =='non'
  62. || strtolower($value) =='o'
  63. || strtolower($value) =='x'
  64. || strtolower($value) =='n'
  65. || stripos($columnName, 'VRAI/FAUX') !== false
  66. || stripos($columnName, 'OUI/NON') !== false
  67. || stripos($columnName, 'O/N') !== false
  68. ) $deductedType = 'boolean';
  69. if(strpos($value,'€') !== false) $deductedType = 'price';
  70. if(stripos($columnName, 'prix ')===0 || stripos($columnName, 'montant ')===0 || stripos($columnName, 'tarif ')===0 ) $deductedType = 'price';
  71. if(stripos($columnName, 'date ')===0) $deductedType = 'date';
  72. if(stripos($columnName, 'catégorie ')===0 || stripos($columnName, 'categorie ')===0 ) $deductedType = 'dictionary';
  73. if(stripos($columnName, 'type ')===0 ) $deductedType = 'dictionary';
  74. return $deductedType;
  75. }
  76. //Réglages spécifiques a ce modèle d'import
  77. public function settings(){
  78. return array();
  79. }
  80. }
  81. ?>