Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/12/2012, 17h05   #1
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Par défaut Petit défi d'expressions régulières

Salut,

Pour l'exportation en sql, j'aurais besoin de transformer une base de ce type :
Code :
1
2
3
<citation>
abaissable|1
(Adjectif)|abattable|inclinable</citation>
En ce format :
Code :
<code type="sql">INSERT INTO `dico` VALUES ('abaissable','abattable,inclinable');</code>
mais ça me semble compliqué
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/12/2012, 17h35   #2
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Il faudrait que tu décrives en français ton schéma de départ.

Par exemple est-ce qu'il y a toujours deux synonymes ? parfois un ? jamais plus de deux ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 20h04   #3
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Je ne savais pas que ça changeait quelque chose, merci de demander.

Il peut y avoir plusieurs synonymes, parfois qu'un :
Citation:
à|1
(Preposition)|chez|dans|parmi
abaca|1
(Nom)|chanvre|chènevière|filasse|jute
abaissable|1
(Adjectif)|abattable|inclinable
abaissant|1
(Adjectif)|avilissant|humiliant|mortifiant|dégradant|vexant|honteux|écrasant|blessant
abaissé|1
(Adjectif)|avili|rabaissé|déconsidéré|diminué|déchu|disqualifié|discrédité|dévalorisé|dévalué
abaisse-langue|1
(Nom)|spatule|manche
C'est chaud
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/12/2012, 21h27   #4
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
En filoutant sur le remplacement des pipes par des virgules ça donnerait ça :
Code :
1
2
 
echo substr("INSERT INTO `dico` VALUES " . str_replace("|", ",", preg_replace ("#(.*)\|1\r\n\(.*\)\|(.*)(\r\n|$)#U", "('\\1','\\2'), ", $input)),0, -2);
Il doit bien y avoir manière de faire seulement avec l'expression régulière mais ...
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/12/2012, 00h13   #5
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
xD ça fonctionne, merci beaucoup ! Troppp fort syntaxe parfaite et tout et tout !

Code :
INSERT INTO `dico` VALUES ('à','chez,dans,parmi'), ('abaca','chanvre,chènevière,filasse,jute'), ('abaissable','abattable,inclinable'), ('abaissant','avilissant,humiliant,mortifiant,dégradant,vexant,honteux,écrasant,blessant'), ('abaissé','avili,rabaissé,déconsidéré,diminué,déchu,disqualifié,discrédité,dévalorisé,dévalué'), ('abaisse-langue','spatule,manche')
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 04h51   #6
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Par contre je me tape une erreur de syntaxe que je n'arrive pas à localiser !

Citation:
ERROR 2006 (HY000) at line 6132: MySQL server has gone away
Je suis sûr que ce n'est pas un timeout car mon MySQL est bien réglé et que j'ai déjà uploadé des bases de la même taille. Ca bloque toujours sur la même ligne (à savoir INSERT INTO `dico` VALUES)

J'ai viré les ', y'a pas de "...

Je trouve pas.

Trouvé.

J'ai un autre problème, à certains endroits la syntaxe était différente et du coup ça donne

Citation:
('mobile','agile,vif'), (Nom),intention,préméditation ('mobilier','ameublement,aménagement
Tu saurais comment enlever les textes en rouge ? Je pense que supprimer entre ') et (' puis remettre la virgule ça marcherait
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 09h50   #7
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Il faut enlever tout le texte en rouge.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 09h54   #8
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33


Il y en a un peu partout
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 10h13   #9
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Donne moi le passage de la source ou il y a "...(Nom)|intention|préméditation...".
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 14h06   #10
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Ca serait possible de les supprimer après le premier formatage, car j'aimerais les supprimer de toute manière ?

Si oui, la source est :

Citation:
('mobile','agile,vif'), (Nom),intention,préméditation ('mobilier','ameublement,aménagement)
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 14h19   #11
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Non les données de départ.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 18h14   #12
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Ok, alors en fait, ce problème se produit quand il y a plusieurs définitions :

Citation:
mode|1
(Nom)|actualité|événements|nouveauté
(Nom)|façon|habitude|coutume
(Nom)|méthode|logique|procédé
Ton code aurait fonctionné s'il y avait eu une seule ligne "(Nom)"
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 18h25   #13
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Est-ce que tu vas avoir besoin de faire cette opération regulièrement ou bien uniquement ponctuellement ?
Si c'est ponctuellement, on peut prévoir un script pas forcemment très élégant mais facile à écrire.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 18h28   #14
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
C'est uniquement pour cette fois
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 20h23   #15
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
J'ai mal répondu ?
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 12/12/2012, 23h40   #16
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Disons que tu mets ta source dans un fichier "file.txt".
Je n'ai pas testé et il faudra retirer la dernière virgule
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
echo 'INSERT INTO `dico` VALUES ';
$handle = fopen('file.txt', 'r');
if ($handle)
{
    while (!feof($handle))
	{
		$ligne = fgets($handle);
                $parts = explode("|", $ligne);
                if ($ligne[1] == "1") {
                     $mot = $ligne[0];
                }
                else {
                     unset($ligne[0]);
                     $synonymes = implode(",", $ligne);
                     echo '("' . $mot . '","' . $synonymes . '"), '; 
                }
	}
	fclose($handle);
}
?>
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 03h47   #17
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
Aie ça marche pas.

Citation:
INSERT INTO `dico` VALUES
( ! ) Fatal error: Cannot unset string offsets in D:\wamp2\www\test3\index.php on line 14
Call Stack
# Time Memory Function Location
1 0.0001 687144 {main}( ) ..\index.php:0
Ligne concernée :
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/12/2012, 10h06   #18
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Ca marchait hier et ça ne marche plus ce matin ?

Sinon j'ai réflechi pendant la nuit : autant executer les requêtes au fur et à mesure (ici j'ai utilisé une requête préparé en PDO mais on peut faire de façon plus préhistorique)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$sth = $cnx->prepare("INSERT INTO `dico` VALUES (:nom, :synonymes);");
$handle = fopen('file.txt', 'r');
if ($handle)
{
    while (!feof($handle))
	{
		$ligne = fgets($handle);
                $parts = explode("|", $ligne);
                if (!empty($ligne)) {
                if ($ligne[1] == "1") {
                     $mot = $ligne[0];
 
                }
                else {
                     unset($ligne[0]);
                     $synonymes = implode(",", $ligne);
                     echo $mot . ' : ' . $synonymes . '<br/>';
                     $sth->execute(array(':mot'=>$mot, ':synonymes'=>$synonymes));
                 }
                 }
	}
	fclose($handle);
}
?>
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 10h38   #19
naivenu
 
Inscription : juillet 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 47
Points : -33
Points : -33
En fait hier ça ne marchait pas non plus, comme un idiot j'avais lancé l'ancien code, avant de passer la nuit à chercher pourquoi l'import sql ne marchait toujours pas...

Ce nouveau code donne :
naivenu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/12/2012, 10h42   #20
sabotage
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 16 849
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 16 849
Points : 21 899
Points : 21 899
Pour le coup la ce n'était pas clef en main, mais bon il manque juste la connexion :
Code :
$cnx = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h35.


 
 
 
 
Partenaires

Hébergement Web