donnée dans csv sous Excel…

Eléphant du PHP | 92 Messages

20 août 2010, 19:20

Bonjour,

Par mon formulaire en PHP, les données sont enregistrées dans MySql et dans un fichier csv.
J’ai des problèmes avec mon fichier csv sous Excel…
Je vous pose 2 questions
1- lorsque l'utilisateur écrit le point-virgule [;] dans un champ de texte (input type="text") au niveau du fichier csv, il y a un problème : à cause de ce point-virgule, il y a une colonne supplémentaire dans mon fichier sous Excel : puisqu’il y a les séparateurs [;] dans un fichier csv.
Comment je peux remédier ce problème ? (dans mysql, tout est correct) :?:

Voici mon code pour la création du fichier

Code : Tout sélectionner

fputs($ouvrir_FD, utf8_decode($var_ville).';'.utf8_decode($var_nom).';'."\n");
2- Si j'utilise la zone de texte [textarea] avec 5 lignes que l'utilisateur passe à la ligne en appuyant sur la touche "Entrée", dans mon fichier csv sous Excel, le 2e paragraphe est en 2e ligne au lieu de rester dans la même ligne. Pourtant dans mon MySql, tout est correct : sur la même ligne (enregistrement)
Comment je peux remédier ce problème (dans mysql tout est correct) :?:

Bon week-end

ViPHP
ViPHP | 5462 Messages

22 août 2010, 18:49

avec mysql tu peux direct enregistrer les données dans un CVS si tu veux :wink:

ViPHP
AB
ViPHP | 5818 Messages

22 août 2010, 21:34

avec mysql tu peux direct enregistrer les données dans un CVS si tu veux :wink:
C'est à dire ?

ViPHP
ViPHP | 5462 Messages

22 août 2010, 23:58

avec mysql tu peux direct enregistrer les données dans un CVS si tu veux :wink:
C'est à dire ?
avec INTO OUTFILE

ca marcher avec n'importe quelle requête
SELECT * FROM truc WHERE machin='blabla' INTO OUTFILE 'monfichier.csv'
par contre si on veux un dossier particulier il faudra le mettre le path en absolue

on peu régler différente option (séparateur et compagnie)
http://dev.mysql.com/doc/refman/5.0/fr/select.html

je sais pas si l'option LOCAL (au cas ou le serveur est distant) marche par contre (je vais faire un test)

ViPHP
AB
ViPHP | 5818 Messages

23 août 2010, 04:34

avec mysql tu peux direct enregistrer les données dans un CVS si tu veux :wink:
C'est à dire ?
avec INTO OUTFILE

ca marcher avec n'importe quelle requête
SELECT * FROM truc WHERE machin='blabla' INTO OUTFILE 'monfichier.csv'
par contre si on veux un dossier particulier il faudra le mettre le path en absolue

on peu régler différente option (séparateur et compagnie)
http://dev.mysql.com/doc/refman/5.0/fr/select.html

je sais pas si l'option LOCAL (au cas ou le serveur est distant) marche par contre (je vais faire un test)
Oui mais cela demande que mysql ait les droits d'écriture dans un fichier et ce n'est quasiment jamais le cas sur un mutualisé.
Perso j'ai du me résoudre à faire une routine php cf php-debutant/les-accents-sous-php-dans- ... ml#p334580
Enfin si tu y arrives ce serait intéressant de connaître la manip :)

ViPHP
ViPHP | 5462 Messages

23 août 2010, 16:47

Oui mais cela demande que mysql ait les droits d'écriture dans un fichier et ce n'est quasiment jamais le cas sur un mutualisé.
Perso j'ai du me résoudre à faire une routine php cf php-debutant/les-accents-sous-php-dans- ... ml#p334580
Enfin si tu y arrives ce serait intéressant de connaître la manip :)
oui en mutu c'est raté, en distant aussi :wink:

Eléphant du PHP | 92 Messages

24 août 2010, 16:07

Bonjour,
Merci pour vos aides…
J’ai réglé mon problème avec la fonction preg_remplace comme vous voyez ci-dessous…
Du coup, j’ai trois questions :

1- Comment je peux optimiser mon code qui se trouve dans la partie de fonction preg_replace ?


Code : Tout sélectionner

// fonction preg_replace // replacer [;] par [.,] // remplacer [\r\n] par [--->] //[\r\n] dans excel, c'est un saut à la ligne $var_ville = preg_replace( "/;/", ".,", $var_ville ); $var_ville = preg_replace( "/\r\n/", "--->", $var_ville ); $var_nom = preg_replace( "/;/", ".,", $var_nom ); $var_nom = preg_replace( "/\r\n/", "--->", $var_nom ); $var_prenom = preg_replace( "/;/", ".,", $var_prenom ); $var_prenom = preg_replace( "/\r\n/", "--->", $var_prenom ); $var_pays = preg_replace( "/;/", ".,", $var_pays ); $var_pays = preg_replace( "/\r\n/", "--->", $var_pays ); //ecriture fichier csv fputs($ouvrir_FD, utf8_decode($var_ville).';'.utf8_decode($var_nom).';'.utf8_decode($var_prenom).';'.utf8_decode($var_pays).';'."\n");


2- est-ce qu’il y a un script php ou javascript qui empêche d’écrire ou transformer les minuscules en majuscule dans un champ de texte ( input / textbox) ?
3- est ce qu’il y a un script php ou javascript qui transforme les accents dans un champ de texte ( input / textbox) ?

Bonne journée

ViPHP
AB
ViPHP | 5818 Messages

24 août 2010, 21:14

Tu pourrais utiliser fputcsv comme dans mon exemple, puisque cette fonction est prévue pour formater des lignes csv
function replace_rn($el)
{
return (str_replace("\r\n",' ',$el));
}

$tab_excel = array();

$tab_excel[] = $var_ville;
$tab_excel[] = $var_nom;
$tab_excel[] = $var_prenom;
$tab_excel[] = $var_pays;

$tab_excel = array_map('utf8_decode',$tab_excel);
$tab_excel = array_map('replace_rn',$tab_excel);


$fp = fopen($ouvrir_FD, 'a+');
       
fputcsv($fp, $tab_excel, ';');
               
fclose($fp);
Sinon pour tout mettre en majuscule il vaut mieux commencer par enlever les accent puis ensuite utiliser la fonction strtoupper
Pour enlever les accents tu peux utiliser le tableau de remplacement de la fonction "Nettoie_nom_fichier" contenu dans cette classe (vers la fin du premier message)

Eléphant du PHP | 92 Messages

27 août 2010, 15:24

Bonjour AB et les autres,

J'ai fait mon fonction autrement...

Code : Tout sélectionner

unction nettoyage($chaine) { $var_fonction_nettoyage =""; if (isset($_POST[$var_fonction_nettoyage])) { { $tb_tableau_nettoyage = array(); $tb_tableau_nettoyage[0] = '/;/'; $tb_tableau_nettoyage[1] = '/\r\n/'; $tb_tableau_replacer = array(); $tb_tableau_replacer[0] = '.,'; $tb_tableau_replacer[1] = '--->'; $var_fonction_nettoyage = preg_replace($tb_tableau_nettoyage, $tb_tableau_replacer, $_POST[$var_fonction_nettoyage]); $var_fonction_nettoyage = utf8_decode($var_fonction_nettoyage); } return $var_fonction_nettoyage; } } fputs($ouvrir_FD, utf8_decode($var_date).';'.nettoyage($var_votre_nom).';'.nettoyage($var_nom_enfant).';'.nettoyage($var_adresse).';'.nettoyage($var_ville).';'.utf8_decode($var_province).';'.utf8_decode($var_code_postal).';'."\n");

Mais je n’arrive pas… Dans les fichiers CSV; les colonnes (ceux que j’ai appliqué la fonction « nettoyage ») sont vides, sans valeur…
Alors à votre avis, comment je peux alléger mon code? ? Je vais surtout faire cela pour apprendre pas pour la vitesse.

Merci

ViPHP
AB
ViPHP | 5818 Messages

27 août 2010, 17:52

Bonjour AB et les autres,

Mais je n’arrive pas… Dans les fichiers CSV; les colonnes (ceux que j’ai appliqué la fonction « nettoyage ») sont vides, sans valeur…
Alors à votre avis, comment je peux alléger mon code? ? Je vais surtout faire cela pour apprendre pas pour la vitesse.

Merci
En fait pour alléger ton code il faut en changer tout simplement. Et je t'ai donné un exemple.

Déjà pour apprendre t'aurais pu essayé de comprendre mon code, de le tester et essayer de l'appliquer à tes besoins.

- A noter que pour faire des remplacements basiques on n'utilise pas preg_replace mais str_replace.

- De même quand on a une fonction native comme fputcsv qui permet de formater du texte au format csv, et que l'on veut un format csv, ben on essai de l'employer plutôt que de bidouiller pour reproduire son fonctionnement.

C'est que j'ai mis en application dans mon exemple, qui utilise par ailleurs la fonction array_map qu'il est intéressant de connaître.

Donc si tu veux apprendre ...

Laisse tomber tes preg_replace qui n'ont rien à faire ici et utilises fputcsv pour formater des fichiers csv !

Apprendre à programmer c'est utiliser les fonctions que l'on a à sa disposition dans le meilleur contexte et le plus simplement possible. Et ton code est à l'opposer de ces principes. Il te reste à apprendre à ne pas continuer d'essayer d'améliorer un code qui n'est pas parti sur de bonnes bases, mais plutôt d'essayer d'en changer :wink:

Eléphant du PHP | 92 Messages

30 août 2010, 16:25

Merci pour tes explications AB :D

C'est excellent et meilleur ta solution... =D>

Marche bien...

Voici :

Code : Tout sélectionner

//remplacement [rn] (lorsqu'utilisateur appuie sur la touche "Entrée") par [--->] pour qu'il n'y a pas de création des colonnes sup dans Excel function replace_rn_saut($el) { //callback --> La fonction de rappel à exécuter pour chaque élément de chaque tableau. //str_replace() retourne une chaîne ou un tableau, dont toutes les occurrences de search dans subject ont été remplacées par replace. //des remplacements basiques on n'utilise str_replace au lieu de preg_replace qui est plus complexe. return (str_replace("\r\n",' ',$el)); } // array --> Liste des tableaux à exécuter via la fonction de callback . //http://php.net/manual/fr/function.array-map.php $tab_excel = array(); $tab_excel[] = $var_date; $tab_excel[] = $var_votre_nom; $tab_excel[] = $var_nom_enfant; $tab_excel[] = $var_adresse; $tab_excel[] = $var_ville; $tab_excel[] = $var_province; $tab_excel[] = $var_code_postal; //fonction array_map ----> Applique une fonction sur les éléments d'un tableau //retourne un tableau après leur avoir appliqué la fonction callback //utf8_decode — Convertit une chaîne UTF-8 en ISO-8859-1 $tab_excel = array_map('utf8_decode',$tab_excel); //apliquer la fonction replace_rn_saut $tab_excel = array_map('replace_rn_saut',$tab_excel); //Ecriture le fichier //fputcsv qui permet de formater du texte au format csv fputcsv($ouvrir_FD, $tab_excel, ';'); //Enfin fermer le fichier fclose($ouvrir_FD); ?>
Bonne journée :)

ViPHP
AB
ViPHP | 5818 Messages

30 août 2010, 17:36

Merci, je vois que ça avance.

Il y aurait juste trois petites remarques :

Le commentaire :
//remplacement [rn] (lorsqu'utilisateur appuie sur la touche "Entrée") par [--->] pour qu'il n'y a pas de création des colonnes sup dans Excel
devrait être remplacé par :
//remplacement [rn] (lorsqu'utilisateur appuie sur la touche "Entrée") par [ ] pour qu'il n'y a pas de création des colonnes sup dans Excel
car c'est le remplacement défini actuellement par str_replace


Le commentaire :
// array --> Liste des tableaux à exécuter via la fonction de callback .
devrait être remplacé par :
// array --> Création du tableau à envoyer à la fonction fputcsv 
Ce que je veux dire c'est que je ne crée pas un tableau pour appliquer les fonctions de callback avec array_map, mais parce que la fonction fputcsv demande un tableau comme paramètre... Ensuite puisque j'ai un tableau et qu'il me faut appliquer quelques traitements aux éléments du tableau (utf8-decode, str_replace...) j'ai choisi d'utilisé array_map (mais j'aurais pu aussi lister les éléments du tableau et leur appliquer les fonctions identiques).


Avant d'utiliser la fonction fputcsv, il faudrait ouvrir/créer un fichier texte, ex :
//...
//Ouverture ou création du fichier $fichier_a_ouvrir_ou_a_creer.csv
$ouvrir_FD = fopen($fichier_a_ouvrir_ou_a_creer.csv, 'a+');

//fputcsv qui permet de formater du texte au format csv
fputcsv($ouvrir_FD, $tab_excel, ';');
               
//Enfin fermer le fichier
fclose($ouvrir_FD);
Aller, bonne continuation :)

Eléphant du PHP | 92 Messages

30 août 2010, 17:53

Vraiment super gentil AB,

c'est encore plus clair avec tes commentaires

ce que j'ai fais pour la création du fichier

Code : Tout sélectionner

//Définir le fichier qui nous intéresse $fichier_data_FD = "data/creation_file.csv"; //Ouvrir le fichier //ou en mode "ajouter" à la fin d'info existant //créé si inexistant $ouvrir_FD = fopen($fichier_data_FD,"a"); //La position du pointeur est dans le file $pointeur_adresse_memoire = ftell($ouvrir_FD); // (...) plus loin apres la fucntion replace_rn_saut et utf8_decode //Ecriture le fichier //fputcsv qui permet de formater du texte au format csv fputcsv($ouvrir_FD, $tab_excel, ';'); //Enfin fermer le fichier fclose($ouvrir_FD);
Merci encore

ViPHP
AB
ViPHP | 5818 Messages

30 août 2010, 18:27

T'en fais quoi de la ligne $pointeur_adresse_memoire = ftell($ouvrir_FD); ? C'est normalement pas nécessaire puisque fopen avec l'option 'a' permet de placer le curseur à la fin du fichier :-k

Ensuite pas la peine d'ouvrir le fichier avant d'avoir à écrire dedans, on l'ouvre juste avant d'écrire dedans. Ton code devrait donc ressembler à ceci (je n'ai gardé que les derniers commentaires utiles)
 <?php 

               //...

               function replace_rn_saut($el)
                   {
                       return (str_replace("\r\n",' ',$el));
                   }
               
               $tab_excel = array();
               
               $tab_excel[] = $var_date;
               $tab_excel[] = $var_votre_nom;
               $tab_excel[] = $var_nom_enfant;
               $tab_excel[] = $var_adresse;
               $tab_excel[] = $var_ville;
               $tab_excel[] = $var_province;
               $tab_excel[] = $var_code_postal;
                
 
               $tab_excel = array_map('utf8_decode',$tab_excel);
              
               $tab_excel = array_map('replace_rn_saut',$tab_excel);
       
                   
              //Définir le fichier qui nous intéresse
              $fichier_data_FD = "data/creation_file.csv";

              //Ouvrir le fichier et place le pointeur de fichier à la fin du fichier ou crée le fichier si inexistant
              $ouvrir_FD = fopen($fichier_data_FD,"a");             

               //fputcsv qui permet d'écrire dans un fichier texte, en formatant le tableau $tab_excel passé en paramètre au format csv et avec ';' comme séparateur de champ (pour avoir le format excel en français )
               fputcsv($ouvrir_FD, $tab_excel, ';');
               
               //Enfin fermer le fichier
               fclose($ouvrir_FD);
               
?>
Modifié en dernier par AB le 30 sept. 2010, 17:56, modifié 2 fois.

Eléphant du PHP | 92 Messages

31 août 2010, 14:54

Bonjour AB,
Un gros merci
Est-ce que tu pourrais me proposer un bon site qui propose auto formation en PHP où je peux mieux apprendre la programmation en PHP ?

Merci encore et bonne journée (en fait, bonne soirée)