Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1664 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  DOM csv/excel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

DOM csv/excel

n°2174548
syron77
Posté le 07-02-2013 à 15:39:53  profilanswer
 

Bonjour,
Je viens vers vous suite à un petit problème.
 
Pour être bref, j'importe un fichier CSV (édité sous Excel 2007) grâce à du PHP via AJAX.
Je récupère les données je les insères dans ma base MYSQL sans soucis.
 
Maintenant je voudrais mettre un peu de sécurité et empêcher que l'utilisateur ne puisse uploader des fichiers ne respectant pas un certain format interne (en-tête des colonnes).
 
Seul problème au moment de comparer les valeurs récupérées et ce qu'il devrait y avoir, j'obtiens toujours FAUX.
 
J'ai essayé
 

Code :
  1. if ($valeurCSV==$valeurVoulue)
  2. if ($valeurCSV===$valeurVoulue)
  3. if (trim($valeurCSV))==trim($valeurVoulue))
  4. if (ord($valeurCSV))==ord($valeurVoulue))
  5. if (ord(trim($valeurCSV))==ord(trim($valeurVoulue)))
  6. strcmp($valeurCSV,$valeurVoulue)


 
J'ai aussi essayé array_diff() après avoir réorganisé mon code.
 
Je n'ai pas réussi.
 
De là j'entends parler de DOM, j'ai ensuite essayé de changer l'encodage de mon script.
Je travaille sous eclipse, je suis donc allé dans workspace pour changer l'encodage par défaut,
puis propriétés du projet et faire de même. Réenregistrer les fichiers concernés, rien n'y fait !
 
J'ai aussi essayé des fonctions php de ce type :
 

Code :
  1. function fopen_utf8 ($filename, $mode) {
  2. $file = @fopen($filename, $mode);
  3. $bom = fread($file, 3);
  4. if ($bom != b"\xEF\xBB\xBF" )
  5. rewind($file);
  6. else
  7. echo "bom found!\n";
  8. return $file;
  9. }


 
Trouvées sur un forum. Je n'ai pas réussi. Donc si quelqu'un avait une solution pour comparer de manière fiable, le contenu d'une cellule CSV avec un chaîne de caractères...
Sachant que je ne sais pas en quoi est encodé mon fichier CSV et que mes scripts sont encodés en CP1252
Je suis plus que preneur.

mood
Publicité
Posté le 07-02-2013 à 15:39:53  profilanswer
 

n°2174579
bistouille
Posté le 07-02-2013 à 16:49:57  profilanswer
 

J'ai jamais travaillé avec des fichiers tableurs en php, mais quelles sont les valeurs de $valeurCSV et $valeurVoulue ?
Ce serait quand même plus simple d'afficher ces valeurs pour voir les différences.
 
Sinon, c'est le bom (byte order mark) pas le dom (document object model)

n°2174603
syron77
Posté le 07-02-2013 à 17:57:01  profilanswer
 

Merci pour cette correction et pour la réponse rapide.
$valeurCSV contient (suivant les versions) tout la ligne du fichier contenant les en-têtes csv séparée par des ";"
ou cellule par cellule.
et $valeurVoulue la même chose
 
(bien sur lors des test j'adapte l'une à l'autre)
 
dans l'idéal le fonctionnement serait basé sur des array puisque j'explode les lignes avec les ";" comme délimiteurs.
 
ensuite je parcours les 2 tableau (celui contenant les valeurs du fichier, et celui contenant les valeurs voulues), et dès lors qu'il y a une différence il met un bolléen à false.
ensuite suivant le bolléen je continue ou non le traitement du fichier et j'affiche un message d'erreur si besoin.
 
Lors d'un echo de chaque variable j'obtiens exactement la même chose, néanmoins mes conditions if ne constatent pas l'égalité.
 
J'ai fait plein de copier/coller depuis mon CSV vers mon script afin d'en être certain. Rien ne change.

n°2174621
bistouille
Posté le 07-02-2013 à 19:53:23  profilanswer
 

La casse est la même aussi ?
 
Bizarre, t'as regardé aussi dans le code source de ta page, quelquefois qu'il y aurait un caractère exotique qui ne serait pas retransmit à l'affichage dans ton navigateur.
 
Teste aussi strlen() sur tes 2 chaines, et éventuellement mb_detect_encoding() pour ta chaine issue de ton fichier csv.
 
Ce sont quelques pistes à explorer, je pense quand même que ça se situe plus sur la différence d'encodage des 2 chaines, à voir.

n°2174659
rufo
Pas me confondre avec Lycos!
Posté le 08-02-2013 à 09:26:47  profilanswer
 

Une fonction pour lire un fichier csv :

Code :
  1. function getContentCSVFile($Filename, $Length = 100000, $Delimiter = ';', $Enclosure = '"', $Escape = '\\', $Mode = 'r')
  2. {
  3.     if (!empty($Filename))
  4.     {
  5.         $ArrayContentFile = array();
  6.         $fp = fopen($Filename, $Mode);
  7.         if ($fp !== FALSE)
  8.         {
  9.             // Read each line, even there is a \n in the line
  10.             while (($Data = fgetcsv($fp, $Length, $Delimiter, $Enclosure)) !== FALSE)
  11.             {
  12.                 $ArrayContentFile[] = $Data;
  13.             }
  14.         }
  15.  
  16.         fclose($fp);
  17.  
  18.         return $ArrayContentFile;
  19.     }
  20.  
  21.     // ERROR
  22.     return array();
  23. }


A adapter sans doute pour gérer de l'utf-8...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2174663
syron77
Posté le 08-02-2013 à 09:49:57  profilanswer
 

Merci à vous deux pour vos réponses.
 
J'ai trouvée une solution, (pas forcément propre mais fonctionnelle ).
 
Grâce a strlen().
 
J'ai remarqué que la longueur de chaine était différente de 2 caractères.
Vu qu'avant je travaillais avec des array, j'avais remarqué que c'était toujours la dernière "ligne" du tableau qui posait problème.  
 
Du coup :  
 

Code :
  1. $valeurCSV=substr($valeurCSV, 0, strlen($valeurCSV)-2);
  2. if ($valeurVoulue===$valeurCSV)
  3. {
  4. }


 
Pour tout ceux qui ont un soucis il vous faut donc enlever les deux derniers caractères de la dernière cellule lue.
 
Merci encore pour votre aide.

n°2174701
rufo
Pas me confondre avec Lycos!
Posté le 08-02-2013 à 11:35:26  profilanswer
 

Question bête : tu gères les fichiers CSV dont le contenu d'une cellule est sur plusieurs lignes (ie, elle comporte des \n) ?
Ma fonction, oui...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2174723
syron77
Posté le 08-02-2013 à 12:47:47  profilanswer
 

Moi personnellement non, le fichier est formaté et il n'y à aucun raison d'y rentrer des données suffisamment longues pour occuper plusieurs lignes.
Et vu que c'est un admin qui s'occupera de l'import, je ne pense pas qu'il s'amuserait a ça.
Par contre est-ce que ça peut poser des erreurs de lecture si la cellule occupe plusieurs lignes ?

n°2174740
rufo
Pas me confondre avec Lycos!
Posté le 08-02-2013 à 14:05:35  profilanswer
 

ben oui. En général, on considère qu'une ligne csv = un enregistrement
Mais si le contenu de la ligne csv a des \n, suivant comment t'as construit ton parser, ça peut poser pb puisque certains enregistrements vont se trouver tronquer...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2174745
syron77
Posté le 08-02-2013 à 14:48:57  profilanswer
 

Ah oui en effet vu comme ça c'est gênant !  
J'en prendrais compte merci !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  DOM csv/excel

 

Sujets relatifs
Compatibilité Excel 2003 et Excel 2010Macro excel : le nom de variable apparaît dans la formule excel
MACRO EXCELExport Feuille Excel en valeur avec cellule fusionnées
Création d'une action en VBA Excel - Besoin d'aideAide pour Macro Excel
Générateur de chiffres à la suite d'une formulemacro sur excel
[HELP] VBA sur ExcelComment exécuter ma macro Excel automatiquement ?
Plus de sujets relatifs à : DOM csv/excel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR