Problème de " et de ; lors de la lecture d'un fichier texte

Résolu
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006 - 22 févr. 2006 à 18:00
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006 - 24 févr. 2006 à 14:08
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

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
23 févr. 2006 à 09:26
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
3
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
22 févr. 2006 à 18:02
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 ??
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
22 févr. 2006 à 18:06
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.
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
22 févr. 2006 à 18:26
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 ??
0

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

Posez votre question
ImmortalPC Messages postés 954 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 11 novembre 2008 2
22 févr. 2006 à 18:57
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.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 févr. 2006 à 19:36
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>
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
22 févr. 2006 à 20:43
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
0
ImmortalPC Messages postés 954 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 11 novembre 2008 2
22 févr. 2006 à 21:00
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.
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
22 févr. 2006 à 21:25
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
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 févr. 2006 à 21:37
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>
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
22 févr. 2006 à 22:14
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
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
22 févr. 2006 à 22:43
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>
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
23 févr. 2006 à 09:20
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 !
0
murrigane Messages postés 88 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 19 mai 2006
24 févr. 2006 à 14:08
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 ! :)
0
Rejoignez-nous