Problème de " et de ; lors de la lecture d'un fichier texte [Résolu]

Signaler
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006
-
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006
-
Bonjour,

J'ai un petit soucis lors de la lecture d'un fichier texte !
Voilà je travail avec un fichier texte dont les données doivent être réinjectés dans une table, ma méthode consiste à ouvrir le fichier texte dans un script php et d'effectuer une requête qui réinjecte les données dans la table par la suite.

Avec mon navigateur j'ouvre la page : injection-membres.php (qui ouvre le fichier membres.txt et qui effectue la requête de réinjection), avec ce fichier j'ai créé un tableau qui me permet de faire une visualisation des informations tel qu'elles sont lues et réinjectées.
le séparateur des données est une tabulation (je précise ca peut vous être utile)
Mes deux soucis sont ceux ci :
Dans mon fichier texte il y a un "champs" qui comporte du texte, dans ce texte parfois on y trouve un ou plusieurs ; et des "
ex :
"location ""Mini Cooper"" cabriolet" (ici la personne à simplement voulu souligner Mini Cooper comme ceci : "Mini Cooper" et quand cette ligne à été lue des " ont été rajoutés)
"horse racing, Opera's season (10 km); thermes at Vichy (10 km)" (ici la personne à voulu ajouter un point virgule pour structurer sa phrase, mais quand cette ligne à été lue des " ont été ajoutés en début de phrase et en fin de phrase)
Naturellement quand les données sont réinjectées dans la table, ces deux anomalies sont elles aussi rajoutées.

Je n'ais pas vraiment d'autres choix que de travailler comme ceci pour faire l'import de mes données, j'ai déjà envisagé une autre solution mais je n'ais pas accès à la table d'origine pour faire un export en .sql (changement d'hébergeur et récupération des données seulement par un fichier export que l'ont peu générer en txt ou csv)

J'avais trouvé une méthode pour protéger le points virgule, mais par la suite tout les guillemets qui étaient présent dans cette partie étaient supprimés.

Merci d'avance aux personnes qui se pencheront sur mon soucis !

14 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

s'il est préparé sous Excel, c'est Excell qui les ajoute pour séparer les champs.
Mon avis, utilise le format CSV, avec fgetcsv ().
http://fr2.php.net/manual/fr/function.fgetcsv.php
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

oups, j'oubliais de précisé que pour les guillemets je pensais utiliser : addslashes() et ensuite stripslashes() avant l'injection dans la base.
Cela fonctionnerai ??
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

c'est très exactement ce que tu dois utiliser, oui.
Mais c'est addslashes AVANT l'injection dans la bvase, stripslashes pour l'affichage ;-)

Il y a aussi mysql_real_escaoe_string si tu travailles avec mysql.
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Merci Malalam pour ta précision mais cela ne fonctionne pas :(
Voila ce que cela me donne : "horse racing, Opera\'s season (10 km); thermes at Vichy (10 km)" (cela me protège bien effectivement mes " )
Peux tu me préciser mysql_real_escape_string ? Je ne la connait pas, j'utilise habituellement addslashes (désolée pour l'erreur dans ce que j'ai dit plus haut, mais oui effectivement je stripslashes pour l'affichage et j'addslashes pour l'injection), laquelle est le mieux ?? (les données sont effectivement réintégrées dans une base MySql)


Par contre je viens de m'appercevoir de quelque chose :


Le fichier d'export que l'on peut utiliser pour transférer nos données d'un hebergement à l'autre est un export global donc on a absolument toutes les informations de la base dedans, à chaque fois on le découpe pour faire des fichiers plus petit qui correspondent à nos nouvelles tables.
Quand je prépare mon fichier, tout est nickel au niveau des "cellules" qui contiennent du texte (je prépare les fichiers sous excel),
par contre une fois créé et enregistré (soit en format txt soit en format csv, j'ai fait les deux) c'est là qu'il me rajoute les " qui sont de trop... Donc finalement cela serait plus une erreur venant d'excel (je pense) lors de l'enregistrement.
Avez vous une solution pour traiter ce problème ??
Messages postés
954
Date d'inscription
mardi 11 mai 2004
Statut
Membre
Dernière intervention
11 novembre 2008
2
Salut,
perso je remplace les " et ' par leur équivalent " et '
ce qui donne un fonction str_replace(array('\'','"'), array(''','"'), $mavar);
@+

Immortal-PC,
téléchargements,astuces ,entre-aide informatique , conseils pour vos problèmes d'ordi.
<!--StartFragment -->Grâce à Immortal-PC votre ordinateur passera les âges.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,

htmlentities($chaine,ENT_QUOTES); sinon.

Mais il faut que tu utilises comme te l'a dit malalam addslashes(). devant toutes les valeurs que tu récupères, avant d'exécuter la requête il faut que tu passes par ça, sinon y'aura forcément une erreur.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Merci Anthomicro et Immortal-PC malheureusement cela n'arrange pas mon problème !

Le gros hic, c'est que ce n'est pas mon script qui les rajoute ces ", mais ils se rajoutent lorsque j'enregistre mon fichier (en texte ou csv).
Il faudrait que je trouve une combine pour justement éviter qu'ils s'ajoutent tout seul. C'est bizarre d'ailleurs qu'ils s'ajoutent comme ça....
Sinon l'autre solution serait de les enlever dans le script mais ca risque d'être plus lourd à gérer parce que :
Cas n°1 :
Si j'ajoute addslashes() voilà ce que cela va me donner
"\location ""\Mini Cooper""\ cabriolet"
Cas n°2 :
"\horse racing, Opera's season (10 km); thermes at Vichy (10 km)"
Mais ils resteront toujours, alors que ce que j'aimerai c'est supprimé les " superflus.

A moins que j'ai pas bien saisie ce que vous m'avez dit dans vos propositions .....
Sinon j'ai trouvé une solution, mais ca me les supprime tous et comme ce sont des descriptions saisie par des membres, enlever les " qu'ils ont ajouté pour souligner quelque chose dans leur phrase, ca va pas le faire du tout ...

Encore merci pour votre aide
Messages postés
954
Date d'inscription
mardi 11 mai 2004
Statut
Membre
Dernière intervention
11 novembre 2008
2
Re,
peux tu nous envoyer la source ??
++

Immortal-PC,
téléchargements,astuces ,entre-aide informatique , conseils pour vos problèmes d'ordi.
<!--StartFragment -->Grâce à Immortal-PC votre ordinateur passera les âges.
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Oui si tu veux, mais je pense pas que cela vous aide beaucoup, puisque le soucis viendrait du fichier : membre.txt en fait...

$membres = file("../base/membres.txt");
$nb_membres = count($hotel);
if ($nb_membres == 0)
{
echo 'Il n\'y a pas de membres enregistrés dans le fichier';
}
//Construction de la table pour visualisation des infos
echo '<table border=1>
';
echo '<tr>
<th bgcolor="#CCCCFF">AUTRESP_FR</th>
<th bgcolor="#CCCCFF">AUTRE_FR</th>
<th bgcolor="#CCCCFF">AUTRESP_UK</th>
<th bgcolor="#CCCCFF">AUTRE_UK</th>
</tr>';

for ($i=0; $i<$nb_membres; $i++)
{
$cols = explode( "\t", $membres[$i]);

//Avec addslashes()
/*$cols[0] = addslashes($cols[0]);
$cols[1] = addslashes($cols[1]);
$cols[2] = addslashes($cols[2]);
$cols[3] = addslashes($cols[3]);*/

//Avec proposition d'Anthomicro
htmlentities($cols[0],ENT_QUOTES);
htmlentities($cols[1],ENT_QUOTES);
htmlentities($cols[2],ENT_QUOTES);
htmlentities($cols[3],ENT_QUOTES);

echo '<tr>
<td align="right">'.$i.'</td>
<td align="right">'.$cols[0].'</td>
<td align="right">'.$cols[1].'</td>
<td align="right">'.$cols[2].'</td>
<td align="right">'.$cols[3].'</td>
</tr>';

Requête d'injection
$sql = 'construction de la requête';

J'ai du faire pas mal de modif parce que je peux pas tout poster sur le forum, mais gobalement c'est ça
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
quel est le contenu (deux ou trois lignes) du fichier que tu ouvres ?
<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Alors le contenu :
Dans le fichier quand je le créer (imaginer les cellule excel), je ne prends que les données que j'ai besoin et enregistre sous le nouveau document.

<tr><td>location "Mini Cooper" cabriolet</td><td></td><td>Car rental (Mini Cooper cabrioler)</td><td><td></tr>
<tr><td></td><td></td><td>hippodrome, Opéra (10 km), thalasso à Vichy (10km)</td><td>horse racing, Opera's season (10 km); thermes at Vichy (10 km)<td></tr>

Après enregistrement du fichier :
<tr><td>"location ""Mini Cooper"" cabriolet"</td><td></td><td>Car rental (Mini Cooper cabrioler)</td><td><td></tr>
<tr><td></td><td></td><td>hippodrome, Opéra (10 km), thalasso à Vichy (10km)</td><td>"horse racing, Opera's season (10 km); thermes at Vichy (10 km)"<td></tr>

le fichier en lui même en ouverture autre que excel :
"location ""Mini Cooper"" cabriolet" \t \t Car rental (Mini Cooper cabrioler) \t \n
hippodrome, Opéra (10 km), thalasso à Vichy (10km) \t \t "horse racing, Opera's season (10 km); thermes at Vichy (10 km)" \t \n

Voilà globalement....
J'espère que ca vous éclaire un peu :S
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Bon bah enlève les addslashes c'est inutile ici. Quand tu sauvegardes utilise avant ceci :

function enlever_slashes(&$texte)
{
if(get_magic_quotes_gpc()===1)
{
return stripslashes($texte);
}
else
{
return $texte;
}
}

bref ensuite lorsque tu récupères tes donnes tu fais un enlever_slashes($_POST['blabla']) ensuite tu sauvegardes le tout dans le fichier (bien qu'apparemment il n'y ait pas besoin de passer par un enlever_slashes() ensuite tu réouvres et tu n'utilises pas le addslashes pour afficher, par contre le htmlentities enlève le ENT_QUOTES et ça devrait aller (même si tu le laisses mais bon... c'est pas utile)
<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Merci Anthomicro mais là encore ça ne m'aide pas à résoudre mon problème, puisque le fichier je le prépare sous excel.
Je test quand même et réenregistrerai mes données dans un autre fichier texte.

Sinon, je vais voir du coté de Access si y a pas moyen de préparer un fichier texte sans rajout de " quand il ne faut pas.

Merci à tous !
Messages postés
88
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
19 mai 2006

Merci Malalam pour ta réponse, j'ai effectivement utilisé cette fonction.

Sinon j'ai aussi remplacé les " par des + (caractère que l'on ne trouve pas dans les descriptions) et le ; par un µ ensuite dans mon script qui traite la préparation de mon fichier d'importation, j'ai fait des str_replace sur les + (") et les µ (;) pour ravoir ma structure nickel.
et j'ajoute également : addslashes()

Merci a tous pour vos réponses ! :)