décomposition des éléments d'un fichier txt uploadé

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : décomposition des éléments d'un fichier txt uploadé

Re: décomposition des éléments d'un fichier txt uploadé

par baneagle » 07 juin 2011, 11:25

Ok c'est bon j'ai compris!
Le fichier texte comportait 2 lignes vides à la fin et donc forcément le contenu du tableau $ligne[] ne pouvait pas être défini pour ces 2 lignes.

Le manque d'enregistrements quant à lui vient tout simplement du fait qu'il y avait des duplicatas dans le fichier txt... :lol:

Mon problème d'accent venait de l'encodage de la base (swedich).

Il n'y a pas un endroit ou indiquer que le problème est résolu? 8-|

Re: décomposition des éléments d'un fichier txt uploadé

par baneagle » 07 juin 2011, 10:54

Bon finalement j'ai essayé avec le \n ça marche. Avec ma méthode, ça ajoutait un \n dans le premier champs de la table (un peu gênant).

Maintenant je me retrouve avec 2 problèmes (un assez simple j'imagine mais l'autre...)

1) Les caractères spéciaux sont envoyés en tant que '?' dans la BDD. Pourtant j'ai mis en début de page:
mysql_query("SET NAMES UTF8"); 
2) Il n'enregistre pas tout. Il bloque vers le milieu et m'affiche:
Notice: Undefined offset: 1 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 3 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 8 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 9 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 11 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 4 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 12 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 14 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 15 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 1 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 3 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 8 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 9 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 11 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 4 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 12 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 14 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26

Notice: Undefined offset: 15 in C:\Documents and Settings\Administrateur\Bureau\EasyPHP-5.3.6.0\local\www\abscence\upload.php on line 26
INSERT INTO etudiant(nom,prenom,numetu,adresse,adresse2,cp,sexe,ville,version,etape) VALUES('','','','','','','','','','') ON DUPLICATE KEY UPDATE nom = '',prenom = '',numetu = '',adresse = '',adresse2 = '',cp = '',sexe = '',ville = '',version = '',etape = ''
Tout ça 2 fois de suite. J'avoue que sur ce coup la je sèche un peu.
Voici le code au complet:
<?php
include 'fonctions.php';
conect_db();  
session_start();
mysql_query("SET NAMES UTF8"); 
if(!isset($_SESSION['login'])) header("Location: index.php");


if (isset($_FILES['fichier'])) { 

$txt = $_FILES['fichier']['name'];   
$chemin_destination = 'upload\\';    
move_uploaded_file($_FILES['fichier']['tmp_name'], $chemin_destination.$_FILES['fichier']['name']);  

$handle = fopen("upload\\".$txt."", "rb");
$contents = stream_get_contents($handle);
$contents = str_replace("'","\'",$contents);
$ligne = explode("\n", $contents);

//$ligne = nl2br($ligne);
//$ligne = explode("<br />", $ligne);

for($i=0;$i < sizeof($ligne);$i++)
	{
		$champs = explode(";", $ligne[$i]);
		$sql = "INSERT INTO etudiant(nom,prenom,numetu,adresse,adresse2,cp,sexe,ville,version,etape) VALUES('".$champs[1]."','".$champs[3]."','".$champs[0]."','".$champs[8]."','".$champs[9]."','".$champs[11]."','".$champs[4]."','".$champs[12]."','".$champs[14]."','".$champs[15]."') ON DUPLICATE KEY UPDATE nom = '".$champs[1]."',prenom = '".$champs[3]."',numetu = '".$champs[0]."',adresse = '".$champs[8]."',adresse2 = '".$champs[9]."',cp = '".$champs[11]."',sexe = '".$champs[4]."',ville = '".$champs[12]."',version = '".$champs[14]."',etape = '".$champs[15]."'";
		echo $i.' '.$sql.'<br><br>';
		mysql_query($sql) or die (mysql_error());
	}
fclose($handle);  
}    

include 'header.php';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>Abscences - accueil</title>
</head>

<body>

<div class="contenu">

<form method="post" enctype="multipart/form-data" action="#">
<fieldset>
<p>
<input type="file" name="fichier" size="30">
<input type="submit" name="upload" value="Uploader">
</p>
</fieldset>
</form>

</div>
</body>
</html>

Re: décomposition des éléments d'un fichier txt uploadé

par baneagle » 06 juin 2011, 22:35

non ce n'est pas un csv mais un txt (sous windows). J'ai finis par résoudre le problème avec un str_replace en remplaçant les \r\n par des
<br />
. Mais maintenant j'ai un nouveau petit souci. Je communiquerai tout ça demain matin.

Re: décomposition des éléments d'un fichier txt uploadé

par Ryle » 06 juin 2011, 22:06

Ton fichier csv est un fichier windows ou unix ? (sous windows, les retours à la ligne sont bien "\r\n", mais sous unix il s'agit uniquement de "\n")

Essayes avec
$ligne = explode("\n", $contents);

Re: décomposition des éléments d'un fichier txt uploadé

par baneagle » 06 juin 2011, 15:45

Yop! Voilà où j'en suis:
J'ai réussi à faire la décomposition d'une ligne et son insertion; seulement voilà, le code ne prend pas en compte le retour à la ligne et donc, je n'ai qu'un enregistrement.
Je précise qu'une ligne se termine par un ';', peut-être une piste. Voici le code:
if (isset($_FILES['fichier'])) { 

$txt = $_FILES['fichier']['name'];   
$chemin_destination = 'upload\\';    
move_uploaded_file($_FILES['fichier']['tmp_name'], $chemin_destination.$_FILES['fichier']['name']);  

$handle = fopen("upload\\".$txt."", "rb");
$contents = stream_get_contents($handle);
$ligne = explode("\r\n", $contents);

for($i=0;$i < sizeof($ligne);$i++)
	{
		echo $i.' '.$ligne[$i].'<br><br>';
		// $champs = explode(";", $ligne[$i]);
		// mysql_query("INSERT INTO etudiant(nom,prenom,numetu,adresse,adresse2,cp,sexe,ville,version,etape) VALUES('".$champs[1]."','".$champs[3]."','".$champs[0]."','".$champs[8]."','".$champs[9]."','".$champs[11]."','".$champs[4]."','".$champs[12]."','".$champs[14]."','".$champs[15]."')") or die (mysql_error());
	}
fclose($handle);  
}
Je précise, j'ai mis un echo seulement pour voir le résultat du code (le véritable code est celui passé en commentaire).

Re: décomposition des éléments d'un fichier txt uploadé

par baneagle » 05 juin 2011, 16:06

Ok je vais me renseigner sur ces fonctions, essayer de me débrouiller et si je coince je reviendrai ici avec mon code.

Merci.

Re: décomposition des éléments d'un fichier txt uploadé

par Ryle » 05 juin 2011, 15:58

Si tu utilises du mysql, tu peux également regarder du côté de l'instruction "LOAD DATA INFILE" qui te permet de charger un fichier directement dans une table.

Sinon en php, effectivement, il faut ouvrir et lire le fichier ligne par ligne (fopen, fread, fclose, ...), et pour chaque ligne parcourir les champs un par un (explode et boucle pour parcourir le tableau). Tu as les bonnes méthodes et leur fonctionnement est détaillé et illustré dans la doc ;)

décomposition des éléments d'un fichier txt uploadé

par baneagle » 05 juin 2011, 15:39

Bonjour à tous,
je suis nouveau (c'est la première fois que j'ai besoin d'une aide extérieure).

Je suis actuellement sur un projet pour la fac de ma ville.
Mon soucis se situe au niveau de l'importation de la base de données étudiant dans mon site/logiciel de gestion des absences tel que:

l'extraction de la base de données renvoie un fichier .txt dans lequel chaque ligne equivaut à un étudiant. Et chaque ligne se compose de renseignement devant prendre place dans une colonne de la table 'étudiant' de ma base mysql.

Voici un exemple de fichier .txt détaillant 2 étudiants:

10589026;dupont;yves;11/13/88;85d7gh;sr9462
10004862;martin;claude;27/03/89;57gh62;1f5e6k

Une ligne se compose de cette façon: n° étudiant;nom;prénom;date de naissance;codétape;codversion

Maintenant le tout est de décomposé ces information dans un boucle. J'imagine qu'il va d'abord falloir différencier chaque ligne puis ensuite décomposer une ligne avec le ; comme séparateur.

Il va surement falloir utiliser du fopen() et du explode() mais ce sont des fonctions que je ne connais pas du tout.

J'éspère ne pas avoir oublié de détail important. Bien sûr je ne demande pas qu'on me ponde le code à ma place, :lol: Mais si on pouvait m'aiguiller dans la marche à suivre et m'en dire un peu plus sur les fonctions à utiliser ce serrait bien sympa! :mrgreen: