extraire contenu entre différents items

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire contenu entre différents items

#21

Message par mikell »

Pour l'instant il n'est pas prévu d'implémenter PCRE v.2 dans une prochaine release d'AutoIt ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
fredmame
Niveau 3
Niveau 3
Messages : 39
Enregistré le : mar. 05 févr. 2019 22:43
Status : Hors ligne

Re: extraire contenu entre différents items

#22

Message par fredmame »

C'est tres technique.
J'ai besoin de temps pour lire les definitions et les comprendre.
Les groupes capturants, le petit msx , la recuperation dans un tableau etc.
Encore merci
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: extraire contenu entre différents items

#23

Message par jchd »

mikell,

Tout dépend de Jon à cette heure.

Valik a apporté énormément et on pouvait argumenter avec lui, du moins sur le plan technique. Et il était souvent drôle, si on passait outre son fort QI et son faible pH.
trancexx aurait pu assurer de plus grands bonds en avant mais son attitude cryptique était (est) trop souvent rédhibitoire.
Jon est capté par son job et j'ignore si sa motivation est intacte.


fredmame,

Les expressions régulières sont en fait un véritable langage à elles seules et à ce titre, elles sont forcément techniques. Avec l'introduction de la récursion, le langage regexp (type PCRE, donc Perl, Ruby, Java et consort) est devenu Turing-complet ; il permet donc théoriquement de réaliser n'importe quel algorithme de cette classe. Evidemment, personne n'imagine en pratique de coder un véritable algorithme ainsi mais il en reste que c'est possible, même au prix de contorsions délirantes.

Comme tous les langages, il a une syntaxe et une grammaire (voir fichier d'aide) et il résulte de chaque "pattern" regexp une sémantique extrêmement précise et potentiellement puissante. Une regexp peut sembler totalement absconse à un néophyte, mais pas plus qu'une requête SQL complexe, qu'un programme APL (ex construire un Sudoku solver), Forth, C# ou un cartouche égyptien en hiéroglyphes à un juriste constitutionnel. La maîtrise des constructions de base regexp demande donc un effort certain mais paye vite l'investissement consenti.

Par exemple, il n'est pas trivial au premier regard que la regex dans le code qui suit permette de déterminer si un nombre est premier. NOTE : Cette regexp peut éventuellement renvoyer un résultat faux sur de grands nombres à cause de limitations de taille de pile interne à l'implémentation de PCRE1, mais l'idée reste valable.

Code : Tout sélectionner

; 15485863 is the million-th prime
Local $a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 31, 101, 456378, 1641537, 1549641, 157 * 43 * 273, 2222222, 12509781, 13998689, 15485863]

Local $r
For $v In $a
	$r = _IsPrime($v)
	ConsoleWrite($v & " est " & ($r ? "premier" : "composite") & @LF)
Next

Func _IsPrime($n)	; n integer >= 0
	Return Not StringRegExp(_StringRepeat('-', $n), '^.?$|^(..+?)\1+$')
EndFunc

Certes cet exemple est un peu exceptionnel mais il illustre la grande compacité possible.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: extraire contenu entre différents items

#24

Message par mdanielm »

C'est curieux mais est-ce vraiment efficace comme méthode?
Prenons n=8 000 087
Le moteur fait des groupes de 2 et constate à la fin de la chaîne qu'il reste un isolé au lieu de la fin de ligne.
Donc il recommence et fait des groupes de 3 et ..pareil.
Donc il fait des groupes de 4 : c'est pas malin puisqu'il n'a pas pu faire des groupes de 2.
Puis il fait des groupes de 5, il reste 2 donc toujours pas de match
etc...
En math on s'arrête à la racine carrée de n donc à des groupes de 2828 caractères mais lui va continuer jusqu'où? 8000087 ?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: extraire contenu entre différents items

#25

Message par jchd »

Bien évidemment ce n'est pas du tout efficace, mais pour un one-liner ça fonctionne raisonnablement vite tant qu'on abuse pas sur la taille (10^6), sinon on risque des faux positifs avec l'implémentation actuelle.

Libre aux courageux de coder en regex un crible Erastothène ou encore un test Jaeschke ou Miller-Rabin :twisted:
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
fredmame
Niveau 3
Niveau 3
Messages : 39
Enregistré le : mar. 05 févr. 2019 22:43
Status : Hors ligne

Re: extraire contenu entre différents items

#26

Message par fredmame »

Bonsoir,
votre discussion me dépasse mais est passionnante....


juste ce message pour poser une question :
Si je souhaite ajouter une extension .zip à chaque nom , où faut il que j'insere la fonction stringreplace ?
je pensais modifier la chaine $split avec une sorte de stringreplace ($split,@CRLF,".zip" & @CRLF)
afin que chaque retour de chariot soit un .zip puis retour chariot
qu'en pensez vous ?

Sinon ca marche au poil c'est génial , je suis super content du résultat.

éventuellement une option serait de regrouper toutes les sous catérogies [ cat1 / sous cat1] [cat1 /sous cat2] en 1 seul fichier cat1 qui contienne tout le listing de chaque sous cat'

pour rappel :
fichier à trier nommé "test"
test.ini contient
[coucou]
a
b
c
[hello / 1]
c
d
e

comment faire pour que le fichier coucou.txt
liste a.zip
b.zip
c.zip ?

voici le code que j'aime bien et que j'ai un peu modifié pour m'aider à choisir le fichier ini et aussi à mettre toute la creation dans un dossier 'filtre"
$Fichierini= FileOpenDialog("Sélectionnez le fichier ini ou txt", @WorkingDir & "\", "ini ou txt (*.ini;*.txt)", $FD_FILEMUSTEXIST)
If @error Then
   MsgBox($MB_SYSTEMMODAL, "", "Aucun fichier sélectionné.")
   Exit
 EndIf



$txt = FileRead($Fichierini) & @crlf

$nom=StringRegExpReplace($fichierini, "^.*\\|\..*$", "")

$dossier = DirCreate("filtres-"&$nom)



$res = StringRegExp($txt, '(?msx) (^\s*\[ ([^\]\r\n]*) \]\h*\R) (.*?)(?=(?1)|\z)', 3)


If IsArray($res) Then
    ;_ArrayDisplay($res)
   For $i = 1 to UBound($res)-2 step 3
       $split = StringSplit(StringStripWS($res[$i], 8), "/")

       If $split[0] = 1 Then

      DirCreate ("filtres-"&$nom &"\" & $res[$i])
       FileWrite("filtres-"&$nom &"\" & $res[$i] &"\" & $res[$i] & ".txt", $res[$i+1])

          ContinueLoop

       Else
          $dir = "filtres-"&$nom &"\" & $split[1]
          If not FileExists($dir) Then DirCreate($dir)
          FileWrite($dir & "\" & $split[2] & ".txt", $res[$i+1])
       EndIf
   Next
EndIf

Bonne soirée à tous et encore je vous remercie, surtout Mikell qui m'a aidé sur mes 2 problemes postés dans ce forum...

https://www.autoitscript.fr/forum/viewt ... =3&t=15065
https://www.autoitscript.fr/forum/viewt ... =3&t=15072
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire contenu entre différents items

#27

Message par mikell »

stringreplace ($split,@CRLF,".zip" & @CRLF)
ça marche s'il n'y a pas de lignes vides. Sinon là aussi un regex va bien... mais ça va rajouter .zip même s'il y a déjà une extension

#Include <Array.au3>

$txt = FileRead("catégories.txt") & @crlf

$res = StringRegExp($txt, '(?msx) (^\s*\[ ([^\]\r\n]*) \]\h*\R) (.*?)(?=(?1)|\z)', 3)

If IsArray($res) Then
   ; _ArrayDisplay($res)
   For $i = 1 to UBound($res)-2 step 3
       $split = StringSplit(StringStripWS($res[$i], 8), "/")
       If $split[0] = 1 Then
          FileWrite(@scriptdir & "\" & $res[$i] & ".txt", _AddZip($res[$i+1]))
       Else
          $dir = @scriptdir & "\" & $split[1]
          If not FileExists($dir) Then DirCreate($dir)
          FileWrite($dir & "\" & $split[2] & ".txt", _AddZip($res[$i+1]))
       EndIf
   Next
EndIf

Func _AddZip($s)
    Return StringRegExpReplace($s, '(\S)(?=\h*\r)', "$1.zip")
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 )
Répondre