A voir également:
- Obtenir lignes d'un fichier en PHP
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
4 réponses
Sri Lumpa
Messages postés
177
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
1 juin 2010
69
16 juil. 2008 à 08:31
16 juil. 2008 à 08:31
Utilise split() pour séparer les lignes et les stocker dans un tableau :
Pour récupérer tout ton fichier dans une seule chaîne de caractère, tu peux utiliser stream_get_contents() :
$lignes = split("\n", chaîne_contenant_l'ensemble_du_fichier);. $lignes sera alors un tableau dont chaque élément sera une ligne de ton fichier.
Pour récupérer tout ton fichier dans une seule chaîne de caractère, tu peux utiliser stream_get_contents() :
$contenuFichier = stream_get_contents($fileHandler);
Sri Lumpa
Messages postés
177
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
1 juin 2010
69
16 juil. 2008 à 14:17
16 juil. 2008 à 14:17
Pour parcourir chaque ligne après, tu as juste à faire un foreach($lignes as $ligne){... traitement sur les lignes ... }
Salut,
Oui avec le foreach ça marche, mais mon fichier excel est composé de la façon suivante :
NOM;PRENOM;DATE
titi;tata;01/02/03
Et avec le foreach il me parcourt tout le fichier. Du coup dans ma requête je récupère aussi les entêtes (la première ligne : NOM;PRENOM;DATE).
Du coup j'ai fait comme ça : je ne sais pas si c'est très propre... :
Et je pense placer ma requête SQL avant le FOR ; par exemple :
Je n'est pas encore tester avec la requête, c'était mon idée, mais j'ai bien peur que ça ne marche pas car il va me lister toutes les lignes... Or moi je voudrais faire une requête par lignes.
Je vais voir. Je reviendrais peut être vers vous ! ;-)
Merci quand même.
Oui avec le foreach ça marche, mais mon fichier excel est composé de la façon suivante :
NOM;PRENOM;DATE
titi;tata;01/02/03
Et avec le foreach il me parcourt tout le fichier. Du coup dans ma requête je récupère aussi les entêtes (la première ligne : NOM;PRENOM;DATE).
Du coup j'ai fait comme ça : je ne sais pas si c'est très propre... :
<?php $file = $_FILES['file']['tmp_name']; $content = file_get_contents($file,'r'); $handle = fopen($file,'r'); $ligne = split("\n", $content); while (($data = fgetcsv($handle, 0, ";")) !== FALSE) { $row++; } for($i=1; $i<$row; $i++) { $ligne[$i]; } $char1 = explode(";", $ligne[0]); echo $char1[0]; //foreach($ligne as $lin) //{ // echo $lin."<br />\n"; //} fclose($handle); ?>
Et je pense placer ma requête SQL avant le FOR ; par exemple :
INSERT INTO ma_table (NOM, PRENOM, DATE) VALUES (FOR....
Je n'est pas encore tester avec la requête, c'était mon idée, mais j'ai bien peur que ça ne marche pas car il va me lister toutes les lignes... Or moi je voudrais faire une requête par lignes.
Je vais voir. Je reviendrais peut être vers vous ! ;-)
Merci quand même.
Sri Lumpa
Messages postés
177
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
1 juin 2010
69
16 juil. 2008 à 15:13
16 juil. 2008 à 15:13
Je pense plutôt qu'il vaut mieux placer les requêtes dans la boucle for plutôt qu'à l'extérieur mais je ne sais pas trop comment s'est géré derrière...
Pour ne pas avoir à faire avec la première ligne (ton entête), tu peux la supprimer :
Ensuite, plutôt que d'utiliser un while pour séparer les colonnes tu peux faire de même que pour les lignes :
La variable $position contiendra la position de la colonne (0 si c'est la première, 1 si c'est la deuxième etc...)
En fait en relisant ton code, je comprends d'où vient ton 48000 lignes alors qu'il n'y en a que 4500 dans le fichier. Si tu stocke ton nombre de lignes dans la variable $rows, alors tu l'incrémentes à chaque fois que tu vois un ";" dans ton while, qui n'est pas signe de passage à la ligne ici...
Pour ne pas avoir à faire avec la première ligne (ton entête), tu peux la supprimer :
unset($lignes[0]);
Ensuite, plutôt que d'utiliser un while pour séparer les colonnes tu peux faire de même que pour les lignes :
unset($lignes[0]); foreach($lignes as $ligne){ $colonnes = split(";", $ligne); foreach($colonnes as $position => $colonne){ ... traitement des donneées... } }
La variable $position contiendra la position de la colonne (0 si c'est la première, 1 si c'est la deuxième etc...)
En fait en relisant ton code, je comprends d'où vient ton 48000 lignes alors qu'il n'y en a que 4500 dans le fichier. Si tu stocke ton nombre de lignes dans la variable $rows, alors tu l'incrémentes à chaque fois que tu vois un ";" dans ton while, qui n'est pas signe de passage à la ligne ici...
J'en suis enfin venu à bout !! :-)
J'ai fait comme tu m'a dit : avec des foreach ! Bien vu.
Voila le code :
Merci beaucoup pour ton aide !
J'ai une dernière petite question. Elle n'a rien a voir avec le sujet... Si tu n'a pas le temps d'y répondre, pas grave !
Maintenant que j'arrive à rentrer un fichier Excel dans une base MySQL, je dois en rentrer plusieurs. Trois pour être excat.
Ces trois fichiers ne sont pas formés de la même façon. Exemple :
Comment tu ferais pour comparer les fichiers entre eux ? Genre voir s'il manque des NOM_USER (qui sont des utilisateurs) et voir s'ils ont eu d'autres enfants ?
(je ne cherche pas du code, juste une méthode)
En tous cas merci encore pour le foreach :-)
J'ai fait comme tu m'a dit : avec des foreach ! Bien vu.
Voila le code :
<?php include 'connexion_bdd.php'; $file = $_FILES['file']['tmp_name']; $content = file_get_contents($file,'r'); $lignes = split("\n", $content); unset($lignes[0]); foreach($lignes as $ligne) { //echo $ligne."<br />\n"; $values = explode(";",$ligne); $statement = "INSERT INTO tabletampon_rh_file (LIBELLECOMMUNEUTILISATION, UNITEDAFFAIRE, LIBELLEUNITEDAFFAIRE, ENTITEDEGESTIONEDG, LIBELLEENTITEDEGESTIONEDG, NOMUSUEL, PRENOMUSUEL, DATENAISSANCE, NATURECONTRATTRAVAILGROUPE, MOTIFINACTIVITE, ACTIF, ALTERN, NONACTIF) VALUES("; foreach($values as $value){ $value = trim($value); // suppression des espaces au début et à la fin $value = str_replace("'","\'",$value); // echappement devant les simples quotes $statement .= "'$value',"; } $statement = substr($statement,0,strlen($statement)-1); $statement.= ");"; echo $statement."<br><br><br><br><br>"; } mysql_query($statement) or die('<br>Erreur SQL !<br>'.$sql1.'<br>'.mysql_error()); ?>
Merci beaucoup pour ton aide !
J'ai une dernière petite question. Elle n'a rien a voir avec le sujet... Si tu n'a pas le temps d'y répondre, pas grave !
Maintenant que j'arrive à rentrer un fichier Excel dans une base MySQL, je dois en rentrer plusieurs. Trois pour être excat.
Ces trois fichiers ne sont pas formés de la même façon. Exemple :
FICHIER 1 : NOM_USER;PRENOM_USER;DATE FICHIER 2 : NOM_ENFANT;PRENOM_ENFANT;NOM_USER;PRENOM_USER;DATE FICHIER 3 : NOM_USER;PRENOM_USER;CODE_POSTAL;ADRESSE
Comment tu ferais pour comparer les fichiers entre eux ? Genre voir s'il manque des NOM_USER (qui sont des utilisateurs) et voir s'ils ont eu d'autres enfants ?
(je ne cherche pas du code, juste une méthode)
En tous cas merci encore pour le foreach :-)
Sri Lumpa
Messages postés
177
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
1 juin 2010
69
16 juil. 2008 à 15:41
16 juil. 2008 à 15:41
Nop, c'était avec plaisir ;)...
Pour ta dernière question, honnêtement, je sais pas trop... Personnellement pour faire ce genre d'opérations j'aurais plutôt tendance à tout monter en base de donnée dans des tables différentes et faire des jointures entre les tables pour retrouver ce genre d'info...
Pour ta dernière question, honnêtement, je sais pas trop... Personnellement pour faire ce genre d'opérations j'aurais plutôt tendance à tout monter en base de donnée dans des tables différentes et faire des jointures entre les tables pour retrouver ce genre d'info...
16 juil. 2008 à 09:09
OK, merci je vais tester ça, je te tiens au courant !
16 juil. 2008 à 12:28
Le problème qui se pose, c'est qu'il m'affiche plus de 48 000 lignes. Or mon fichier en fait à peine 4 500.
Je pense que le problème vient de là :
Je voulais compter le nombre de lignes dans le fichier pour trouver le deuxième paramètre de la boucle FOR : . Et arrêter de boucler une fois arrivée à la fin du fichier. (avec le dans le WHILE)
Du coup je suis bloqué !
Quelqu'un voit comment former la boucle FOR ?
Merci d'avance !