IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Importation CSV et gestion accents


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut Importation CSV et gestion accents
    Bonjour,

    J'avais au départ poster dans "débutant", pensant que mon problème était simple. Il parait plus complexe. Je ne sais pas vraiment si je dois poster dans "syntaxe", "fichier" ou ailleurs.

    La situation :
    Origine :
    * Un listing de produit sous Excel (version inconnue, OS inconnu, ceux de l'opérateur)
    But :
    * Injection de ce listing dans Mysql
    Solution mise en place :
    * Export en CSV (sous Excel)
    * Formulaire Web d'envoi de fichier
    * Récupération et traitement d'injection par Php.

    Le problème :
    la gestion des accents et caractères spéciaux comme : à ö ê £ ¼ ...

    Apparement il s'agit d'un problème d'encodage.
    La DB est en UTF-8

    j'ai testé les chaines avec par exemple htmlentities utf8_encode($str);
    le résultat n'est pas bon

    quelqu'un aurait il une piste ?
    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    htmlentities n'est deja pas une bonne solution puisqu'il n'y a pas de HTML dans ton histoire.

    Il convient par contre de verifier la concordance des éléments :
    - encodage du fichier CSV.
    - encodage du fichier PHP.
    - encodage de la base de donnée.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    il y a un peu de HTML, petit oubli de ma part :
    le module affiche un <table> de résultat après injection afin de permettre à l'opérateur de vérifier ce qui vient de se faire

    - encodage du fichier CSV.
    Aucune idée, comment définit-on cela ?
    Sachant que la personne qui exporte le CSV n'est en rien spécialiste en informatique, c'est l'un des opérateurs chez mon client
    Sur Ma version Excel 12.2.0 / Excel 2008 pour Mac (English) je n'ai pas d'option pour cela.
    je peux par contre faire un "save as" en CSV ou Windows CSV ou MS-dos CSV.

    - encodage du fichier PHP.
    Aune idée, comment puis-je voir cette info ?
    mon éditeur est BBedit, je ne trouve pas cela
    par contre je vois :
    si BBedit ne peut pas deviner l'encodage => UTF-8
    si création nouveau fichier => UTF-8

    - encodage de la base de donnée.
    La DB : MySQL charset: UTF-8 Unicode (utf8)
    La table : Collation utf8_general_ci
    les champs : "utf8_general_ci"

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tu peux peut-être voir si ceci peut t'aider :

    http://fr.php.net/manual/fr/function.iconv.php#91190
    Pourfendeur de singletons en croisade

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    Pourquoi faire iconv ?

    http://php.net/manual/en/function.mysql-set-charset.php

    Ne pas oublier cette fonction qui permet de mettre la connection mysql dans le bon encodage. Si ton csv est en utf-8 comme il se doit, ne pas oublier de le dire à MySQL en utilisant cette fonction. Si il ne l'est pas, MySQL peut faire la conversion, ce qui t'évide du boulot.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Thanks PetitBidum
    je m'en vais de ce pas testé cette nouvelle piste !

    Si ton csv est en utf-8 comme il se doit
    comment contrôler cela ?
    Je suppute que l'opérateur qui crée le CSV est soit en :
    OSX avec open Office
    OSX avec un MSoffice 2208
    XP avec MsOffice récent
    cela fait beaucoup pour simplement supputer, non ?

    Personnellement, suis sous OSX MSOffice 2008, je n'ai pas d'option. Je ne peux donc pas choisir cela.
    Bien bien lu sur plein de forum que certains tableurs offraient cette option, mais pas tous.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    au cas où avoir le code serait utile, voici le contenu de mon include.
    il y manque certains concepts (le fichier path.inc , le fichier db.inc et le fichier php qui contient ce .inc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    <div id="contentnormal">
    <? 
    $classe = "listing";
    $classe2 = "listingbis";
    ?>
    	<table border="0" cellspacing="0" cellpadding="0" align="left" width="100%" bgcolor="#999999">
    		<tr bgcolor="#999999">
    			<form action="<? echo $_SERVER['PHP_SELF'];?>?act=import" method="post" enctype="multipart/form-data">
    				<td width="150">
    					<input type="hidden" name="upl_csv" value="upl_csv">
    					<input type="hidden" name="idproduct" value="<? echo $idproduct;  ?>"> 
    					<input type="file" name="photo" size="15">
    				</td>
    				<td width="30">
    					<input id="formgeneral" type="image" src="<? echo $illu;?>validate_mgrey.png" border="0" name="Rechercher" alt="Search" width="25" height="25">
    				</td>
    				<td>
    					Importation pour Injection de fichier de type "EXPORT EXCEL au format CSV en ; " d&rsquo;apr&egrave;s model pr&eacute; &eacute;tabli !
    				</td>
    			</form>
    		</tr>
    	</table>
    <?php
    ### Function concept ###
    	# parameter 'file name' / CSV oriented
    	# parameter 'table name'
    	# Action : field type analyse
    	# Action : 1st line process for field name
    	# Action : other lines value corrective for specific type
    	# Action : insert
    	# Action : satelite actions
    #/## Function concept ###
     
    ### VARIABLES ###
    	$sep_first_table = 1; # 1st table ends x field(s) before the end.
    #/## VARIABLES ###
     
    switch ($_POST['upl_csv']) {
    	case "upl_csv": # Upload an original
    		if ($_FILES['photo']['name'] != '') {
    			$csvfolder = $doc.'csv/';
    			$finalfile = $csvfolder.'csv-1.csv';
    			$_POST['namefile'] =  $_FILES['photo']['name'];
    			#$namefile =  $_FILES['photo']['name'];
    			move_uploaded_file($_FILES['photo']['tmp_name'] , $finalfile); #for historic issues later
    			chmod ($finalfile, 0777);
    		}
    }
    $f = $finalfile;
    if(file_exists($f)) {
    	ini_set('auto_detect_line_endings', true);
        $MyFile = file($f);  // place the file in an array
        $nb = count($MyFile);    // count the number of lines or values
    	echo '<table class="'.$classe.'" border="1" width="100%" cellspacing="1" cellpadding="1" align="center">';
    	echo '<tr>
    		<th class="'.$classe.'" width="30">#</th>
    		<th class="'.$classe.'">Title</th>
    		<th class="'.$classe.'">Id</th>
    	</tr>';
    	$count_line = 0; // to handle 1st line
    	foreach ($MyFile AS $MyLine) // we handle the array of the file, line by line
    	{
    		if ($count_line == '0') {
    			$line_to_handle = $MyLine;
    			$MyLine = htmlentities($MyLine);
     
    			$explo_field_name = explode(";", $line_to_handle); // 1 XLS value = 1 array value = 1 field_name
    			$count_field_name = count($explo_field_name); // count the number of Fields
    			$field_for_insert = $count_field_name - $sep_first_table; // To manage the value addition later => X - Other_Table_fields
    			$field_for_stock = $count_field_name - $sep_first_table + 1; // To manage the stock addition later
     
    			$sql_insert = '';
    			$turn_field = 0;
    			foreach ($explo_field_name AS $MyField) { // we handle the array of the 1st line : Field_name
    				if ($turn_field < $field_for_insert)  {
    					if ($sql_insert != '') { $sql_insert .= ", "; }// for separator between values
    					$sql_insert .= "`".$MyField."`";
    					$turn_field++; // for field counter
    				}
    			}
    			$sql_insert_field = 'INSERT INTO `ztestimportproduct` ('.$sql_insert.', `agentmodif`, `datemodif`) VALUES (';
    		} elseif ($count_line == '1') {
    			# SUB TITLE line in XLS FILE # To be ignored
    		} else {
    			$sql_insert_values = '';
    			# Other line than 1st and 2nd => INSERT into MySQL
    			$MyLine = str_replace('"', '', $MyLine);
    			$MyLine = str_replace("'", "", $MyLine);
    			$line_to_handle = $MyLine;
     
    			$explo_field_value = explode(";", $line_to_handle); // 1 XLS value = 1 array value = 1 field_value
    			$turn_value = 0;
    			while ($turn_value < $field_for_insert) # Al fields from 1st table 
    			{
    				switch ($MyField[$turn_value]) {
    					case "price_sell": // case = number
    					case "price_sell_wvat": // case = number
    						$explo_field_value[$turn_value] = fnbrbk($explo_field_value[$turn_value]); // translate French number in Sql number 'coma into dot'
    					break;
    					default: 
    				}
    				if ($sql_insert_values != '') { $sql_insert_values .= ", "; }// for separator between values
    				$sql_insert_values .= "'".(str_replace("'", "&rsquo;", $explo_field_value[$turn_value]))."'";
    				$turn_value++;
    				if ($turn_value == '3') { $tourtable++; echo '<tr><td class="'.$classe.'">'.$tourtable.'</td><td class="'.$classe.'">'.(str_replace("'", "&rsquo;", $explo_field_value[$turn_value])).'</td>'; }
    			}
    			$thistime = strftime("%Y-%m-%d %T");
    			$sql_insert_values .= ", '".$_SESSION['idagent']."', '".$thistime."');";
    			$sql_insert_final = $sql_insert_field.' '.$sql_insert_values;
    			# echo '<br>'.$sql_insert_final.'<br>';
    			$product = new db();
    			$product->inline("$sql_insert_final");
     
    			$idproduct = mysql_insert_id() ;
    			echo '<td class="'.$classe.'">'.$idproduct.'</td></tr>';
    			### STOCK
    			$_POST['idproduct'] = $idproduct;
    			$_POST['datein'] = $today;
    			$_POST['type'] = 'stockin';
    			$_POST['note'] = 'import XLS';
    			$_POST['quantity'] = $explo_field_value[$turn_value];
    			if (($_POST['quantity'] >= 1) AND ($_POST['note'] != '')) {
    				### ADD A STOCK
    					$ajout = new db('ztestimportstock', 'idstock');
    					$ajout->AJOUTE(array('idproduct', 'datein', 'quantity', 'type', 'note'));
    				### ADD A STOCK
    			}
    			#/## STOCK
    		}
    		$count_line++;
    	}
    	echo '</table>';
    } else {
    	echo 'No file';
    }
    ?> 
    </div>

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par cholopat Voir le message
    Bien bien lu sur plein de forum que certains tableurs offraient cette option, mais pas tous.
    OpenOffice offre l'option. Pour ce qui est de MS Office, tu dis que non, c'est assez ennuyeux... et autodétecter un encodage, ce n'est pas si simple...

    A moins que tu ne places dans la première ligne de ton fichier excel un header connu d'avance qui comporte des accents.

    Pour savoir dans quel encodage est ton fichier CSV, ouvre le avec un navigateur comme Firefox (en l'affichant comme un fichier texte) et choisis dans le menu Affichage -> Encodage l'encodage qui convient pour que tes accents s'affichent bien.

  9. #9
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 487
    Points : 5 134
    Points
    5 134
    Par défaut
    Commence par encoder la page avec la table en UTF-8
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    tu peux le régler dans le menu Markup > Character Set
    et enregistre la en UTF-8 NO BOM, il te suffit de faire File > Save As et de cliquer sur Options pour le régler.

    Ensuite revérifie l'affichage
    -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_SIGNATURE -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
    Dans la mesure du possible, essayez de montrer votre problème en situation réelle en nous donnant une url, que l'on puisse tester.
    Pensez également à cocher

    Aucun problème ne doit être résolu en MP (Message Privé) le forum est là pour ça.

    Dimension Internet

  10. #10
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    la page est bien en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    J'ai ouvert le CSV comme suggéré par Peufeu dans Firefox, Western (Macroman) est ce qu'il convient dans mon cas.
    Mais je ne suis pas l'utilisateur final ...
    le ou les clients doivent injection toutes les semaines un nouveau listing produit, fonction des nouveauté sur le marché. je ne peux pas imposser de travailler avec un tel tableur et un tel OS ..
    et autodétecter un encodage, ce n'est pas si simple...
    A moins que tu ne places dans la première ligne de ton fichier excel un header connu d'avance qui comporte des accents.
    Pourrais tu svp m'en dire plus ?
    Merci !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    Western ça doit être de l'ISO-8859-1 ou -15 donc pas de l'utf-8 donc problème.

    Macroman j'ai aucune idée. Un super héros japonais ?

    En gros pour éviter les erreurs d'encodage, tu peux mettre dans la première ligne de ta feuille Excel une chaîne de caractère qui contient des accents.

    Ensuite, quand tu parses le CSV, tu regardes ce que tu obtiens :

    Par exemple, si ton header contient un "é" et que tu obtiens :

    \xc3\xa9 y'a de bonnes chances que ce soit de l'UTF8
    \xe9 là ce serait plutôt du ISO-8859-15 ou du latin-1 ou autre

  12. #12
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    MacRoman n'est pas le nouveau Samourai, non ...

    c'est je pense un charset propre aux Mac

    Ensuite, quand tu parses le CSV, tu regardes ce que tu obtiens :
    Je ne parse pas manuellement le CSV, c'est le serveur PHP qui s'en occupe, à la volée, après un upload fichier validé.

    Pour recentrer, je ne cherche pas à savoir en quoi est "MON" csv, mais bien à gérer n'importe quel CSV (on peut laisser de coté chinois, arabe, cyrillique et autres, le projet n'a pas une volonté tant interstellaire)

    d'un autre coté, si la détection ne peut être fidèlement automatisée, je peux toujours bidouiller un bricolage et ajouter un select dans mon formulaire afin de demander à l'opérateur de signaler sur et avec quoi il a créé son CSV ... mais c'est pas top propre...

    je vais tout de même repasser tous vos conseils en revue et php.net, dès que mon module Paypal sera fonctionel, à chaque jour sa top priorité.

  13. #13
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 487
    Points : 5 134
    Points
    5 134
    Par défaut
    Un truc bête, l'éventualité de gérer le csv par un formulaire PHP plutôt que Excel serait pas mal ^^
    Peut-être pourquoi pas avec une "Spreadsheet" de Google Docs...
    -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_SIGNATURE -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
    Dans la mesure du possible, essayez de montrer votre problème en situation réelle en nous donnant une url, que l'on puisse tester.
    Pensez également à cocher

    Aucun problème ne doit être résolu en MP (Message Privé) le forum est là pour ça.

    Dimension Internet

  14. #14
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Peut-être pourquoi pas avec une "Spreadsheet" de Google Docs...
    parce que mes clients me demandent une solution simple, sans devoir comprendre, depuis leurs PC ou Mac ou Pinguin, en genre 2 ou 3 clicks, avec ou sans connection.
    d'où l'idée : Excel => export CSV => envoi fichier par le back office du e-shop => post traitement d'injection par PHP vers MySql.
    mais aussi d'où le problème : le char set sur différents OS.

    Un truc bête, l'éventualité de gérer le csv par un formulaire PHP plutôt que Excel serait pas mal ^^
    là par contre, je n'ai pas compris la proposition.

    Je pense de plus en plus à créer un simple fonction de conversion de caractères

  15. #15
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut Petibidon, you are an angel !!! merci !
    MERCI !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php
    $value = iconv('Windows-1252', 'UTF-8//TRANSLIT', $value);
    ?>
    j'avais négligé ton lien http://fr.php.net/manual/fr/function.iconv.php#91190

    pas bien, perdu 2 jours.

    la prochaine fois je lirai tout plus lentement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Import-Csv (ipcsv) gestion des accents
    Par Janksar dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/09/2011, 16h01
  2. gestion d'erreur importation csv
    Par dybmans dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/04/2011, 12h38
  3. [phpMyAdmin] Soucis accents avec Importer CSV en phpMyAdmin
    Par bruce-willis dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 19/07/2010, 18h58
  4. import csv décimale
    Par gIch dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/12/2005, 12h46
  5. Importation CSV vers base de données
    Par Brice Yao dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/06/2005, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo