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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    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
    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 éprouvé
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    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 émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    http://fr.php.net/manual/fr/function.iconv.php#91190

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    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 éprouvé
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    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 éprouvé
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    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 éclairé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    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.

+ 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, 17h01
  2. gestion d'erreur importation csv
    Par dybmans dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/04/2011, 13h38
  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, 19h58
  4. import csv décimale
    Par gIch dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/12/2005, 13h46
  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, 14h42

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