Fichiet .txt et mysql

cedric php -  
samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,


Je débute en php.
J'ai un fichier qui arrive en .txt sur le serveur.
Ce fichier contient différents champs qui vont alimenter la base de données.
J'ai un souci sur un des champs.
Il s'agit d'un champs qui entre dans la base de données dans un champs Text.

Dans le fichier reçu (.txt), le champ en question contient des sauts de ligne visiblement ce qui, lors du traitement du fichier et son inétégration dans la base de données, provoque des problèmes (décalage des autres champs etc).

Comment faire pour que ces sauts de ligne, ne soient pas considérés comme des passages dans un autre champ ? (il est bien indiqué dans mon script de fonctions, qu'un changement de champs se fait par ",".

Merci beaucoup pour votre aide.

6 réponses

samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   5
 
Est ce qu'un élément indique qu'il s'agit de al fin d'un champ ???

C'est à dire un point ou autre chose
0
cedric php
 
Chaque champ est délimité par une virgule.
En fait j'ai :
/* On lit une ligne */
$ligne = fgets($fp,8192);
/* On récupère les champs séparés par ; dans liste*/
$liste = explode( '","', $ligne);
0
samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   5
 
Engros si je comprend bien tu as dans ton fichier :
Champ1,champ2,champ3,textelong textelong textelong
textelong
textelong
Chmp11,champ21,champ31,textelong textelong textelong2


et tu voudrais que le texte long soit une unique variable:


pour parcourir un fichier texte (sources : http://dev.petitchevalroux.net/php/lecture-fichier-ligne-par-ligne-php.227.html
/*Ouvre le fichier et retourne un tableau contenant une ligne par élément*/
$lines = file('/path/file.txt');
/*On parcourt le tableau $lines et on affiche le contenu de chaque ligne précédée de son numéro*/
$var1 = null;
$var2 = null;
$var3 = null;
foreach ($lines as $lineNumber => $lineContent)
{
        /* on va tester que la ligne contient ou non des virgule */
        if(ereg(",",$lineContent))
        {
              /* requete d'insertion des données */
              ici ta requete du genre
              $req = "INSERT INTO matable(c1,c2,c3) VALUES ('$var1',$var2,$var3)";
              execute ta requete               

              unset($var1,$var2,$var3);
              /* nouvelle ligne */
              $array = explode(",",$lineContent);
              $var1 = $array[0];
              $var2 = $array[1];
              $var3 = $array[2];
        }
        else
        {
              /* Sinon on ajoute le reste a ta précédente variable */
              $var3 .= $lineContent;
         }
        
	echo $lineNumber,' ',$lineContent;
}


Apres tu adaptes ....
0
cedric php
 
Euh ouh la la !
Bon je vais essayer :(

Merci en tous cas
0
cedric php
 
Voici le bout de code qui a été développé.

while (!feof($fp)) /* Et Hop on importe */
{ /* Tant qu'on n'atteint pas la fin du fichier */
$ligne = fgets($fp,8192); /* On lit une ligne */

/* On récupère les champs séparés par ; dans liste*/
$liste = explode( '","', $ligne);


/* On assigne les variables */
$type_bien = $liste[1];
$code_societe = '1864';
$code_site = $liste[2];
$num_asp = $liste[3];
$numDossier = $liste[4];
$reference = $liste[5];
$prix_bien = $liste[6];
$prix_bien = number_format($prix_bien, 0, '', '');
$charges = $liste[7];
$taxe_hab = $liste[8];
$taxe_fonciere = $liste[9];
$ville = $liste[10];
$zone_bien = $liste[11];
$titre = $liste[12];
$nb_pieces = $liste[13];
$nb_chambres = $liste[14];
$surf_habitable = $liste[15];
$surf_carrez = $liste[16];
$surf_sejour = $liste[17];
$surf_terrain = $liste[18];
$etage = $liste[19];
$nb_niveau = $liste[20];
$annee_construction = $liste[21];
$type_cuisine = $liste[22];
$nb_toilettes = $liste[23];
$nb_sdb = $liste[24];
$nb_salle_eau = $liste[25];
$park_int = $liste[26];
$park_ext = $liste[27];
$nb_garages = $liste[28];
$nb_cave = $liste[29];
$type_chauffage = $liste[30];
$ascenseur = $liste[31];
$balcon = $liste[32];
$terrasse = $liste[33];
$nb_mitoyennete = $liste[34];
$txt_mailing = $liste[35];
$txt_mailing .= "<br>";
$DPE1 = $liste[36];
$DPE2 = $liste[37];
$DPE3 = $liste[38];
$DPE4 = $liste[39];



$titre=addslashes($titre);
$txt_mailing=addslashes($txt_mailing);
$ville=addslashes($ville);
$titre=addslashes($titre);

//$numDossier = str_replace('"', '', $numDossier);

/* Ajouter un nouvel enregistrement dans la table */


$query = "INSERT into tmp_dossier (num_dossier) Values( '$numDossier' )";
$result = mysql_query($query, $link) or die(mysql_error());

$query = "SELECT * FROM achat WHERE
num_dossier='$numDossier' ";
$result = mysql_query($query, $link) or die("Une erreur a empêché l'ouverture de la page : err-1");
$num_rows = mysql_num_rows($result);

// si le dossier existe déjà alors, on modifie les champs, sinon on insère
if($num_rows==0){
if($numDossier!=""){
$query = "INSERT into achat (
num_dossier, code_societe, code_site, num_asp, type_bien, prix_bien, taxe_fonciere, taxe_hab,
charges, reference, ville, titre, nb_pieces, nb_chambres,
surface_habitable, surf_carrez, surf_sejour, surf_terrain,
etage, nb_niveau, annee_construction, type_cuisine, nb_toilettes,
nb_sdb, salle_eau, park_int, park_ext, nb_garages, nb_cave,
type_chauffage, ascenseur, balcon, terrasse, nb_mitoyennete,
texte_mailing, zone_bien, DPE_etiq_energie, DPE_tx_GES, DPE_val_energie, DPE_val_tx_GES )

Values('$numDossier','$code_societe','$code_site','$num_asp','$type_bien','$prix_bien','$taxe_fonciere', '$taxe_hab','$charges','$reference','$ville','$titre','$nb_pieces', '$nb_chambres',
'$surf_habitable', '$surf_carrez', '$surf_sejour', '$surf_terrain',
'$etage', '$nb_niveau', '$annee_construction', '$type_cuisine', '$nb_toilettes',
'$nb_sdb', '$nb_salle_eau', '$park_int', '$park_ext', '$nb_garages', '$nb_cave',
'$type_chauffage', '$ascenseur', '$balcon', '$terrasse', '$nb_mitoyennete',
'$txt_mailing','$zone_bien','$DPE1','$DPE2','$DPE3','$DPE4' )";
$result = mysql_query($query, $link) or die(mysql_error());
}
}else{
$query2="UPDATE achat SET
num_dossier='$numDossier',
code_societe='$code_societe',
code_site='$code_site',
num_asp='$num_asp',
type_bien='$type_bien',
prix_bien='$prix_bien',
taxe_fonciere='$taxe_fonciere',
taxe_hab='$taxe_hab',
charges='$charges',
reference='$reference',

ville='$ville',

titre='$titre',
nb_pieces='$nb_pieces',
nb_chambres='$nb_chambres',
surface_habitable='$surf_habitable',
surf_carrez='$surf_carrez',
surf_sejour='$surf_sejour',
surf_terrain='$surf_terrain',

etage='$etage',

nb_niveau='$nb_niveau',
annee_construction='$annee_construction',
type_cuisine='$type_cuisine',
nb_toilettes='$nb_toilettes',
nb_sdb='$nb_sdb',
salle_eau='$nb_salle_eau',
park_int='$park_int',
park_ext='$park_ext',
nb_garages='$nb_garages',
nb_cave='$nb_cave',
type_chauffage='$type_chauffage',
ascenseur='$ascenseur',

balcon='$balcon',

terrasse='$terrasse',
nb_mitoyennete='$nb_mitoyennete',
texte_mailing='$txt_mailing',
zone_bien='$zone_bien',
DPE_etiq_energie='$DPE1',
DPE_tx_GES='$DPE2',
DPE_val_energie='$DPE3',
DPE_val_tx_GES='$DPE4'
WHERE num_dossier='$numDossier'";
$result2 = mysql_query($query2, $link) or die("Une erreur a empêché l'ouverture de la page : err-4<br>".mysql_error());


}

// fin du while
}




Je ne sais pas si ça peut vous aider :(
0
cedric php
 
Le champ me posant pb étant $txt_mailing = $liste[35];
0
samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   5
 
Maintenant est ce que tu peux poster un extrait de ton fichier texte (pour se faire une meilleur idée)
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Pour commencer, deux risques à prendre en compte :

1 - Es-tu sûr que le premier et le dernier champs ne peuvent pas contenir de sauts de ligne ? Si oui, on va s'en sortir ; sinon, c'est inextricable.

2 - Ton champ texte peut-il contenir une virgule ? Si oui, t'es foutu ! Ou alors il faudra penser à choisir un autre séparateur, ou à échapper la virgule.


Je vois deux approches possibles pour la résolution du problème :

1 - traiter l'ensemble du fichier sans le découper ligne par ligne, en ne s'occupant que des virgules. Ça va demander quand même un peu de gymnastique pour traiter le champ 39.

2 - traiter ligne par ligne comme aujourd'hui, mais compter les virgules passées pour inclure la ligne suivante à la ligne en cours s'il n'y a pas eu le bon nombre de virgules.

Xavier
0
samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   5
 
Excellente idée de compter les virgules !!!
0
cedric php
 
Bon, ça me paraît de plus en plus compliqué tout ça !!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cedric php
 
"2","1864","01","5880350","00007","7899","299000","0","0","900","LOOS","Z03","Maison lotissement","7","6","120","0","32","0","","","1991","Equipée","1","1","1","0","0","1","0","Individuel","","0","1","2","LOOS 299 000 EUROS
MAISON DE 1991 COMPRENANT: entrée, salon séjour de 32m², cuisine équipée, 6 chambres salle de bain et salle de douche, jardin et garage attenant, MAISON TRES SOIGNEE, RARE SUR LE SECTEUR AVEC 6 CHAMBRES. RUE CALME ET AGREABLE A DEUX PAS DU CENTRE ET DE LILLE.
CLASSE ENERGIE C.","C","D","149","35",


Voilà une ligne qui est mal interprétée. La coupure se fait visiblement après 299 000 EUROS, ce qui correspond à un saut de ligne. Je ne pense pas que ce soit un pb de virgule mais bel et bien d'un saut de ligne.
0
samyb2313 Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   5
 
Tu peux aussi créer un tableau, si tu as 39 cases alors tu insères les données, sinon tu passes à la ligne suivante et tu ajoutes le contenu de la ligne qui suit dans la dernière case du tableau.
0