Page 1 sur 1
[..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 07:44
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 !
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 12:56
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
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 15:48
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

Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 16:21
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
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 16:58
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
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 17:23
par networe
En choisissant str1 = fileread, j'obtient : Error: Subscript used with non-Array variable
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 18:38
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 ?
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 19:07
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', ''),
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 19:17
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
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 19:20
par networe
Array variable subscript badly formatted
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 19:37
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.
Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 20:00
par networe
Oh mon dieu ---______---
J'ai lu à quelque part : La solution la plus simple est toujours la meilleure
Merci jchd

et merci Mikell

Re: [..] Preg_Match en Autoit
Posté : lun. 27 mai 2013 21:11
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.