Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Recherche d'une expression dans un source Sam 18 Nov 2017 - 23:53 | |
| Bonsoir à tous ! Voici un petit programme de recherche dans un source. Bien qu’il soit destiné à être greffé à mon programme d’analyse ( https://panoramic.1fr1.net/t5501-analyser-un-code-panoramic ), c’est une version totalement autonome et opérationnelle. La recherche d’une expression est un peu particulière : Le programme affiche simultanément toutes les lignes où est présente l’expression recherchée et occulte les lignes non concernées. Nous avons donc une vue générale de la recherche. Après avoir chargé un source, cliquez sur >> Search >> puis tapez les caractères que vous souhaitez trouver. N’hésitez pas à me faire remonter vos remarques. Bonne programmation et bon dimanche à tous ! - Code:
-
' ------------------------------------------------------------------------------ ' PANORAMIC SEARCH ' MARC37 - November 2017 - Panoramic v0.9.28.i12 ' http://panoramic-language.pagesperso-orange.fr/French/index.html ' http://panoramic.top-forum.net ' ------------------------------------------------------------------------------ DIM a$ : ' file name to analyze DIM b$ : ' Reading a line of a$ DIM c$ : ' uppercase of b$ DIM d$ : ' formatted line number as ###### DIM i%, j% : ' variable loop FOR/NEXT DIM LineNumber%, FontSize%, MemoInUse% DIM Word$, UpperWord$ LABEL Resize, OpenFile, Bigger, Smaller, About, Quit LABEL FindText, DataEntry, StringSearch FontSize% = 10 DLIST 50 : ' hidden object => source code to analyze Mask() ON_CLOSE 0, Quit ON_RESIZE 0, Resize ON_CLICK 1, OpenFile ON_CLICK 2, Quit ON_CLICK 3, About ON_CLICK 4, Smaller ON_CLICK 5, Bigger ON_CLiCK 6, FindText END ' ------------------------------------------------------------------------------ FindText: OFF_CLICK 6 FOR i%=20 TO 22 HIDE i% NEXT i% SHOW 21 MemoInUse% = 21 IF TEXT$(6)=" >> Search >>" THEN TEXT 6,"" Word$=TEXT$(6) DISPLAY GOSUB StringSearch RETURN ' ------------------------------------------------------------------------------ DataEntry: Word$=TEXT$(6) GOSUB StringSearch RETURN ' ------------------------------------------------------------------------------ StringSearch: UpperWord$ = UPPER$(Word$) CLEAR 21 SHOW 100 DISPLAY FOR LineNumber% = 1 to COUNT(50) IF Word$="" b$=ITEM_READ$(20,LineNumber%) ITEM_ADD 21,b$ ELSE b$=UPPER$(ITEM_READ$(50,LineNumber%)) IF INSTR(b$,UpperWord$)>0 b$=ITEM_READ$(20,LineNumber%) ITEM_ADD 21,b$ END_IF END_IF ON_CHANGE 6, DataEntry NEXT LineNumber% HIDE 100 RETURN ' ------------------------------------------------------------------------------ OpenFile: IF OBJECT_EXISTS(40)=0 THEN OPEN_DIALOG 40 FILTER 40,"*.bas|*.bas" a$=FILE_NAME$(40) IF a$="_" THEN RETURN CLEAR 50 FOR i% = 20 TO 21 CLEAR i% NEXT i% FOR i% = 4 TO 6 HIDE i% NEXT i% OFF_RESIZE 0 OFF_CLICK 1 OFF_CHANGE 6 ON_CLiCK 6, FindText LineNumber% = 1 FOR i% = 21 to 22 HIDE i% NEXT i% SHOW 20 TEXT 6, " >> Search >>" waitingMessage() FILE_OPEN_READ 40,a$ CAPTION 0, a$ WHILE FILE_EOF(40)<>1 FILE_READLN 40,b$ d$=STR$(LineNumber%) WHILE LEN(d$)<6 d$=" "+d$ END_WHILE c$=UPPER$(b$) ITEM_ADD 50, b$ ITEM_ADD 20, d$+" "+b$ LineNumber% = LineNumber% + 1 END_WHILE FILE_CLOSE 40 HIDE 100 FOR i% = 4 TO 6 SHOW i% NEXT i% ON_RESIZE 0, Resize ON_CLICK 1, OpenFile RETURN ' ------------------------------------------------------------------------------ About: FOR i%=20 TO 22 HIDE i% NEXT i% SHOW 22 MemoInUse% = 22 ON_CLiCK 6, FindText RETURN ' ------------------------------------------------------------------------------ Resize: FOR i% = 20 TO 22 WIDTH i%, (WIDTH(0)-100) HEIGHT i%, (HEIGHT(0)-60) NEXT i% RETURN ' ------------------------------------------------------------------------------ Bigger: FontSize%=FontSize% + 1 IF FontSize% > 16 THEN FontSize% = 16 : RETURN FOR i% = 20 TO 22 FONT_SIZE i%, FontSize% NEXT i% HIDE MemoInUse% : SHOW MemoInUse% RETURN ' ------------------------------------------------------------------------------ Smaller: FontSize%=FontSize% - 1 IF FontSize% < 8 THEN FontSize% = 8 : RETURN FOR i% = 20 TO 22 FONT_SIZE i%, FontSize% NEXT i% HIDE MemoInUse% : SHOW MemoInUse% RETURN ' ------------------------------------------------------------------------------ SUB Mask() WIDTH 0, 1025 HEIGHT 0, 727 LEFT 0,(SCREEN_X-WIDTH(0))/2 TOP 0,(SCREEN_Y-HEIGHT(0))/2 COLOR 0, 180,180,180 BUTTON 1 WIDTH 1, 100 HEIGHT 1, 25 LEFT 1,13 TOP 1,10 CAPTION 1, "&Open" BUTTON 2 WIDTH 2, 100 HEIGHT 2, 25 LEFT 2,13 TOP 2, 650 CAPTION 2, "&Quit" BUTTON 3 WIDTH 3, 100 HEIGHT 3, 25 LEFT 3,13 TOP 3, 610 CAPTION 3, "&About" CREATE_HIDE BUTTON 4 WIDTH 4, 100 HEIGHT 4, 25 LEFT 4,13 TOP 4,530 CAPTION 4, "&Smaller" BUTTON 5 WIDTH 5, 100 HEIGHT 5, 25 LEFT 5,13 TOP 5,570 CAPTION 5, "&Bigger" EDIT 6 WIDTH 6, 100 HEIGHT 6, 25 LEFT 6,13 TOP 6,470 TEXT 6, " >> Search >>" for i% = 1 to 6 : font_bold i% : next i% FOR i%= 20 TO 22 LIST i% LEFT i%, 125 TOP i%,10 WIDTH i%, 870 HEIGHT i%, 666 FONT_NAME i%,"Courier New" FONT_SIZE i%,10 NEXT i% SHOW 20 TextAbout() MessageBox() END_SUB ' ------------------------------------------------------------------------------ SUB MessageBox() PANEL 100 WIDTH 100,300 HEIGHT 100,200 FONT_NAME 100,"Arial" FONT_SIZE 100,14 COMMAND_TARGET_IS 100 ALPHA 101 TOP 101, 60 LEFT 101, 100 CAPTION 101, "Please wait" ALPHA 102 TOP 102, 110 LEFT 102, 60 CAPTION 102, "Analysis in progress..." COMMAND_TARGET_IS 0 SHOW 101 SHOW 102 END_SUB ' ------------------------------------------------------------------------------ SUB WaitingMessage() TOP 100, (HEIGHT_CLIENT(0)-200)/2 LEFT 100, (WIDTH_CLIENT(0)-300)/2 SHOW 100 END_SUB ' ------------------------------------------------------------------------------ SUB TextAbout() ITEM_ADD 22,"" b$=" PANORAMIC SEARCH" ITEM_ADD 22, b$ b$=" MARC37 - November 2017 - Panoramic v0.9.28.i12" ITEM_ADD 22, b$ b$=" http://panoramic-language.pagesperso-orange.fr/French/index.html" ITEM_ADD 22, b$ b$=" http://panoramic.top-forum.net" ITEM_ADD 22, b$ END_SUB ' ------------------------------------------------------------------------------ Quit: TERMINATE RETURN
| |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Recherche d'une expression dans un source Dim 19 Nov 2017 - 1:39 | |
| Salut Marc. J’ai testé et c’est bon. Merci pour le partage. Comme je suis de l’ancienne génération de l’époque de feu DOS, j’aimerais bien signaler la présence de deux commandes que l’on peut lancer à partir de l’invite de commandes et qui offrent une très grande souplesse d’emploi. - FIND et FINDSTR:
1) La commande FIND Recherche une chaîne de texte dans un ou des fichiers.
FIND [/V] [/C] [/N] [/I][/OFF[LINE]] "chaîne" [[lecteur:][chemin]nom_de_fichier[ ...]]
/V Affiche toutes les lignes ne contenant pas la chaîne spécifiée. /C Affiche seulement le nombre de lignes contenant la chaîne. /N Affiche les numéros de ligne avec les lignes affichées. /I Ignore la casse lors de la recherche de la chaîne. /OFF[LINE] Ne pas ignorer les fichiers dont l'attribut hors connexion a été réglé. "chaîne" Spécifie la chaîne de texte à trouver. [lecteur:][chemin]nom_de_fichier Spécifie un ou des fichiers pour la recherche.
Sans nom de chemin, FIND recherche le texte entré à l'invite ou redirigé depuis une autre commande.
2) La commande FINDSTR Recherche de chaînes de caractères dans les fichiers.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M][/O] [/P] [/F:fichier] [/C:chaîne] [/G:fichier] [/D:liste de répertoires] [/A:attributs de couleur] [chaînes] [[lecteur:][chemin]nom de fichier[ ...]]
/B Recherche l'élément s'il est en début de ligne. /E Recherche l'élément s'il est en fin de ligne. /L Recherche les chaînes littéralement. /R Recherche les chaînes en tant qu'expressions. /S Recherche les fichiers correspondants dans le répertoire actif et dans tous ses sous-répertoires. /I Spécifie que la recherche ne doit pas tenir compte de la casse. /X Affiche les lignes correspondant parfaitement. /V N'affiche que les lignes non correspondantes. /N Affiche le numéro de ligne devant chaque ligne correspondante. /M Affiche uniquement le nom des fichiers contenant des chaînes correspondantes. /O Affiche le décalage des caractères pour chaque ligne correspondante. /P Ignore les fichiers ne contenant pas de caractères affichables. /OFFLINE Ne pas ignorer les fichiers dont l'attribut hors connexion a été réglé. /A:attr Spécifie l'attribut de couleur avec 2 chiffres hexadécimaux. Entrez "color /?". /F:fichier Lit la liste des fichiers dans le fichier spécifié (/ pour la console). /C:chaîne Recherche la chaîne spécifiée littéralement. /G:fichier Obtient les chaînes à rechercher à partir du fichier spécifié (/ pour la console). /D:rép Recherche dans une liste de répertoires délimitée par des points-virgules. chaînes Chaînes à rechercher. [lecteur:][chemin]nom de fichier Spécifie les fichiers dans lesquels effectuer la recherche.
Utilisez des espaces pour séparer plusieurs chaînes à rechercher, sauf si l'argument est précédé de /C. Exemple : 'FINDSTR "bonne journée" x.y' recherche "bonne" ou "journée" dans le fichier x.y. 'FINDSTR /C:"bonne journée" x.y' recherche "bonne journée" dans le fichier x.y.
Petit guide des options usuelles : . Caractère joker = tout caractère * Répétition : zéro occurrences ou plus du caractère ou de la classe précédents ^ Emplacement : début de ligne $ Emplacement : fin de ligne [classe] Classe de caractères : tout caractère du jeu [^class] Classe inverse : tout caractère n'appartenant pas au jeu [x-y] Limites : tout caractère dans les limites spécifiées \x Échappement : utilisation littérale du métacaractère x \ xyz\> Emplacement : fin du mot
Voici le résultat de ton code et de la commande FIND (exécutée en ligne de commandes) sur le même fichier : Le résultat est identique. Remarque : la chaîne recherchée est "xmax" dans le même fichier. - Spoiler:
| |
|
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Recherche d'une expression dans un source. Dim 19 Nov 2017 - 8:18 | |
| Bonjour.
Pour info, Klaus nous a concocté une fonction similaire, que j'utilise abondamment:
res%=dll_call6("SearchStringInTextFile",adr(fic$),adr(crit$),LineNumbers%,AtStartOnly%,OutType%,OutHandle%)
LineNumbers: 0=pas de numéros de ligne <>0=numéros de ligne AtStartOnly: 0=dans toute la ligne <>0=au début de la ligne uniquement OutType: chercher le critère entier: 0=clipboard 1=Memo 2=Combo 3=List chercher tous les mots séparément: 10=clipboard 11=Memo 12=Combo 13=List sans signaler les mots chercher tous les mots séparément: 20=clipboard 21=Memo 22=Combo 23=List en signalant les mots OutHandle%: ignoré si OutType%=0, ou handle de l'objet sinon Si OutType%=2, 12 ou 22: les résultats sont ajoutés au contenu existant de la combo.
| |
|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Recherche d'une expression dans un source Dim 19 Nov 2017 - 11:28 | |
| Belle réalisation Marc 37 ! Comme quoi même en 100% Panoramic, on peut faire des chose très intéressante... J'ai testé sur plus de 5000 lignes et c'est bluffant même avec un résultat sur de nombreuses lignes. Bravo continu comme ça... | |
|
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Recherche d'une expression dans un source Dim 19 Nov 2017 - 14:16 | |
| Je viens de tester et ça marche Bravo Marc37, tu es entrain de nous concocter, sinon un déboguer, au moins un assistant au débogage. Très utile... A+ | |
|
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Recherche d'une expression dans un source Lun 20 Nov 2017 - 11:08 | |
| Merci à tous pour vos retours.
@Papydall : Merci du rappel ! Eh oui, même sous W10, les commandes DOS survivent !
@Pedro: Merci aussi pour le rappel de la DDL de Klaus qui a implémenté entre autres, de puissantes et rapides fonctions de recherche.
Merci pour vos tests, je continue pour le plaisir de programmer, même si ça existe déjà... Le plaisir de faire soi-même !
Bonne journée à tous !
| |
|
Contenu sponsorisé
| Sujet: Re: Recherche d'une expression dans un source | |
| |
|