Obtenir lignes d'un fichier en PHP

Fermé
DAG - 15 juil. 2008 à 17:21
 DAG - 16 juil. 2008 à 16:01
Salut à tous,

J'utilise le code suivant pour afficher un tableau Excel au format HTML :

$fic = fopen($file, 'rb');
echo "<table border='1'>\n";
for ($ligne = fgetcsv($fic, 1024, ";"); !feof($fic); $ligne = fgetcsv($fic, 1024, ";")) {
   echo "<tr>";
   $j = sizeof($ligne);
   for ($i = 0; $i < $j; $i++) {
      echo "<td>".$ligne[$i]."</td>";
   }
}
for ($i = 0; $i < sizeof($ligne); $i++) {
   echo "<td>".$ligne[$i]."</td>";
}


J'aimerai pouvoir récupérer simplement les données ligne par ligne afin de pouvoir effectuer des
requêtes SQL par la suite.

Par exemple si le fichier est composer ainsi :

tata;tutu;05/02/06
titi;toto;01/06/74


Je souhaiterais récupérer tata;tutu;05/02/06 dans une variable afin de pouvoir construire ma
requête SQL.

Si quelqu'un a une idée ?

Merci d'avance à tous pour vos réponses.
A voir également:

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
Utilise split() pour séparer les lignes et les stocker dans un tableau :
$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);
0
Salut,

OK, merci je vais tester ça, je te tiens au courant !
0
J'ai eu le temps de tester un peu ce matin : voici un petit bout de code que j'ai écris...

<?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) 
{
	$num = count($data);
	for($i=1; $i<$num; $i++)
	{
		echo $ligne[$i];
		echo "<br>";
	}
}
//$char1 = explode(";", $lignes[0]);
fclose($handle);
?>


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à :
while (($data = fgetcsv($handle, 0, ";")) !== FALSE) 
{
	$num = count($data);

Je voulais compter le nombre de lignes dans le fichier pour trouver le deuxième paramètre de la boucle FOR :
for($i=1; $i<$num; $i++)
. Et arrêter de boucler une fois arrivée à la fin du fichier. (avec le
!== FALSE
dans le WHILE)

Du coup je suis bloqué !

Quelqu'un voit comment former la boucle FOR ?

Merci d'avance !
0
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
Pour parcourir chaque ligne après, tu as juste à faire un foreach($lignes as $ligne){... traitement sur les lignes ... }
0
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... :

<?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.
0
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
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 :
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...
0
J'en suis enfin venu à bout !! :-)

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 :-)
0
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
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...
0
Oui c'est ce que je compte faire : rentrer mes 3 fichier dans des tables différentes et comparer les tables entre elles.

En tous cas, merci pour tout !

A+
0