[..] Preg_Match en Autoit

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

[..] Preg_Match en Autoit

#1

Message par networe »

Bonjour,

J'ai une énorme base de donnée en texte et j'aimerais que

(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', '', 'Mustang GT Convertible 1989', 'In Stock', ''),
(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', '', 'Shelby GT-500 1969', 'In Stock', ''),

Deviennent :

(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', 'Mustang GT Convertible 1989', 'Mustang GT Convertible 1989', 'In Stock', ''),
(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', 'Shelby GT-500 1969', 'Shelby GT-500 1969', 'In Stock', ''),

Donc que ne gros ( Suivi de n'importe quoi jusqu'à ', '', '', '', ' prendre ce qu'il y a jusqu'à ', 'In Stock', ''), puis le copier dans le 3eme '' vide

Comment faire cela , je suis vraiment nul dans les pregmatch :(

Merci !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#2

Message par mikell »

En l'occurence c'est plutôt du preg_replace

Code : Tout sélectionner

$str1 = "(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', '', 'Shelby GT-500 1969', 'In Stock', ''),"
Msgbox(0,"", _Rectif($str1) )

$str2 = "(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', '', 'Mustang GT Convertible 1989', 'In Stock', ''),"
Msgbox(0,"", _Rectif($str2) )

Func _Rectif($txt)
   Return StringRegExpReplace ($txt, "^(?:.*?\K('.*?')){6}(,\h*)('.*?')" , "$3$2$3")    
EndFunc
Traduction du regex : "remplace la 6ème occurence de ('.*?') par la suivante en n'oubliant pas la virgule et l'espace entre les 2 "
Pour traiter toutes les lignes d'un fichier txt :

Code : Tout sélectionner

;$str1 = "(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', '', 'Shelby GT-500 1969', 'In Stock', '')" &@crlf& _ 
;   "(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', '', 'Mustang GT Convertible 1989', 'In Stock', '')"
$str1 = FileRead("1.txt")
Msgbox(0,"", _Rectif($str1) )

Func _Rectif($txt)
   Return StringRegExpReplace ($txt, "(?s)\((?:.*?\K('.*?')){6}(,\h*)('.*?')" , "$3$2$3")    
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#3

Message par networe »

Merci !

Y a-t-il un moyen de mieu comprendre StringRegExpReplace pour en arriver facilement à (?s)\((?:.*?\K('.*?')){6}(,\h*)('.*?')

Et d'où viens le $3$2$3 ?

Merci :)
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#4

Message par networe »

Mince ! Souvent il y avait exemple des ' avant ou même deux '' dans les description avant, donc plusieurs bug sont survenu (Il y a 6000+ lignes) donc aller avec une logique du 6eme ' ' n'est pas valide dans mon cas
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#5

Message par mikell »

Pour traiter 6000+ lignes, vaut mieux avoir une logique, quelle est la logique valable dans tous les cas ?
On peut essayer de traiter chaque ligne en partant de la fin

Code : Tout sélectionner

$str1 = "(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', '', 'Shelby GT-500 1969', 'In Stock', '')" &@crlf& _
   "(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', '', 'Mustang GT Convertible 1989', 'In Stock', '')"
;$str1 = FileRead("1.txt")
Msgbox(0,"", _Rectif($str1) )

Func _Rectif($txt)
 $txt2 = ""
 $parts = StringRegExp($txt, '(\(.+?\))', 3)  ; récupère les parties entre parenthèses
 For $i = 0 to UBound($parts)-1
   $res = StringRegExp($parts[$i], "(, '.*?')", 3)  ; sépare les blocs de type : (, 'xxx')
   $a = UBound($res)-1
   $txt2 &= StringReplace($parts[$i], $res[$a-3]&$res[$a-2], $res[$a-2]&$res[$a-2], 1, 1) & @crlf
 Next
 Return $txt2
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#6

Message par networe »

En choisissant str1 = fileread, j'obtient : Error: Subscript used with non-Array variable
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#7

Message par mikell »

Strange... si ton fichier est de cette forme

Code : Tout sélectionner

(21, 1, 1, '<p>Bourgogne</p>', '<p>Bourgogne</p>', 'mustang-gt-convertible-1989', '', '', '', 'Mustang GT Convertible 1989', 'In Stock', '')
(26, 1, 2, '', '', 'shelby-gt-500-1969', '', '', '', 'Shelby GT-500 1969', 'In Stock', '')
etc
et si le chemin du fichier dans le FileRead est bon ça doit marcher
Tu posterais pas ton txt en pièce jointe ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#8

Message par networe »

Il y a des :

INSERT INTO `ps_product_lang` (`id_product`, `id_shop`, `id_lang`, `description`, `description_short`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`, `available_now`, `available_later`) VALUES
(18, 1, 1, 'Turquoise', 'Turquoise', 'ford-mustang-cobra-1993', '', '', '', 'Ford Mustang Cobra 1993', 'In Stock', ''),
(18, 1, 2, 'Turquoise', 'Turquoise', 'ford-mustang-cobra-1993', '', '', '', 'Ford Mustang Cobra 1993', 'In Stock', ''),
(19, 1, 1, 'Bourgogne et gris', 'Bourgogne et gris', 'ford-mustang-gt-1992', '', '', '', 'Ford Mustang GT 1992', 'In Stock', ''),
(19, 1, 2, 'Bourgogne et gris', 'Bourgogne et gris', 'ford-mustang-gt-1992', '', '', '', 'Ford Mustang GT 1992', 'In Stock', ''),
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#9

Message par mikell »

OK, remplace juste cette ligne dans le script

Code : Tout sélectionner

 $parts = StringRegExp($txt, '(\(\d.+?\))', 3)  ; récupère les parties entre parenthèses
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#10

Message par networe »

Array variable subscript badly formatted
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#11

Message par jchd »

Euh, ça ne serait pas plus simple et beaucoup plus fiable de faire une paire d'update de la base de données ?

update latable set lacolonneX = lacolonneY where lacolonneX = '';
update latable set lacolonneZ = lacolonneY where lacolonneZ = '';

A adapter, évidemment.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
networe
Niveau 4
Niveau 4
Messages : 92
Enregistré le : lun. 30 nov. 2009 02:36
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#12

Message par networe »

Oh mon dieu ---______---

J'ai lu à quelque part : La solution la plus simple est toujours la meilleure

Merci jchd :D et merci Mikell :)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Preg_Match en Autoit

#13

Message par jchd »

Ouaip, quite à passer par une table temporaire pour importer le fatras, le remettre au propre, éventuellement faire toutes vérifs requises dessus et hop, insert massif dans la vraie table en dur.

Même si c'est un job de routine, ça s'automatise probablement mieux que bidouiller dans des csv incomplets.

Tant mieux si cette voie t'inspire.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre