Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Remplacer une sous-chaîne de caractères par une autre | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 10:55 | |
| Panoramic dispose de plusieurs fonctions sur les chaînes de caractères. Mais comme toujours, il n’y a jamais assez pour subvenir à tous les besoins. A titre d’exemple : comment remplacer dans une chaîne de caractères, une sous-chaîne par une autre ? Soit t$ = "Voici un exemple d’utilisation de ma procédure" Je veux remplacer "exemple" par "test" pour obtenir "Voici un test d’utilisation de ma procédure". Le code suivant présente une SUB qui réalise cette fonction. On peut remplacer soit la 1ère occurrence du mot à remplacer soit toutes les occurrences de ce même mot. L’appel à la SUB se fait comme ceci : - Code:
-
Remplace(t$,s1$,s2$) t$ est la chaîne d’origine, s1$ est la sous chaîne à remplacer s2$ est la sous-chaîne de remplacement. Le résultat se trouve dans la variable globale remplace$ - Code:
-
rem ============================================================================ rem Remplace.bas par Papydall rem Remplacer dans le texte t$, la 1ère occurence (ou toutes les occurences) rem de la chaine s1$ par la chaine s2$ rem ============================================================================ dim t$,s1$,s2$,t1$ t$ = "Ceci est un exemple d'utilisation de la SUB Remplace(t$,s1$,s2$): exemple réussi "
s1$ = "exemple" s2$ = "test" t1$ = t$ rem ============================================================================ ' Exemple d'appel pour remplacer la 1ère occurence de s1$ : ' Remplace(t$,s1$,s2$) : t$ = remplace$ rem ============================================================================ ' Exemple d'appel pour remplacer toutes les occurences de s1$ while instr(t$,s1$) > 0 : Remplace(t$,s1$,s2$) : t$ = remplace$ : end_while rem ============================================================================ message "Texte original : " + t1$ + chr$(13) + "On va remplacer " + s1$+" par "+ s2$+chr$(13)+"Texte final : " + t$
end
rem ============================================================================ ' Remplacer dans le texte T$, la chaîne S1$ par la chaîne S2$ ' Le retour est dans la variable globale REMPLACE$ ' Cette procédure (utilisée comme fonction) remplace la 1ère occurence de S1$ ' par S2$ dans T$. ' REMARQUE : ' Pour remplacer toutes les occurences de S1$ par S2$ dans T$, l'appel se fera ' comme ceci : ' while instr(t$,s1$) > 0 : Remplace(t$,s1$,s2$) : t$ = remplace$ : end_while rem ============================================================================ SUB Remplace(t$,s1$,s2$) dim_local f$,retour$,g$ if variable("remplace$") = 0 then DIM remplace$ f$ = "c:\temp\replace.vbs" : retour$ = "c:\temp\retour.txt" : g$ = chr$(34) FILE_OPEN_WRITE 9999, f$ file_writeln 9999, "Function Replace(string_1,strPattern, strReplaceString)" file_writeln 9999, "Set regEx = New RegExp" file_writeln 9999, "regEx.Pattern = strPattern" file_writeln 9999, "Replace = regEx.Replace(string_1,strReplaceString)" file_writeln 9999, "retour = Replace" file_writeln 9999, "End Function" file_writeln 9999, "Set fso = CreateObject("+g$+"Scripting.FileSystemObject"+g$+")" file_writeln 9999, "Set MyFile = fso.CreateTextFile("+g$+retour$+g$+", True)" file_writeln 9999, "MyFile.WriteLine(Replace("+g$+t$+g$+","+g$+s1$+g$+","+g$+s2$+g$+"))" file_writeln 9999, "MyFile.Close" FILE_CLOSE 9999 EXECUTE_WAIT f$ : FILE_DELETE f$ file_open_read 9999,retour$ : file_readln 9999,Remplace$ file_close 9999 : file_delete retour$
END_SUB rem ============================================================================
| |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 15:58 | |
| bonjour Papydall, Remplacer un chaine par une autre ça déjà du être fait sous panoramic. Je ne sais pas si Nardo avait fait une sub pour cela? En tout cas, voici ma contribution, une petite sub vite faite: - Spoiler:
dim a$
a$="Voici un exemple de mon programme" substitue("test","exemple")
a$="Ma voiture roule lentement" substitue("vite","lentement")
a$="Voici mon café!" substitue("Voilà","Voici")
a$="Voici mon café!" substitue("","Voici ")
a$="mentir" substitue("s","m")
a$="tends" substitue("u","s")
a$="tandis!" substitue("t p","d")
a$="Ici on enlève le premier espace!" substitue(""," ")
a$="Ici on laisse tout comme c'est!" substitue("Là","rien") end
sub substitue(b$,c$) dim_local i print a$ i=instr(a$,c$) if i>0 then b$=left$(a$,i-1)+b$:a$=b$+right$(a$,len(a$)-i-len(c$)+1) print a$ print end_sub
Mais ta procédure est valable pour remplacer par exemple tous les mots d'un texte (exemple ==> test). A + | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 18:05 | |
| Les deux sont bien, S'il n'y a qu'un seul mot à changer celle de Bignono est bien plus légère. Mais celle de Papydall, est la plus efficace pour un éditeur de texte.
Bravo! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 19:10 | |
| Voici un code qui remplace tout un bloc de texte par un autre bloc dans un fichier texte. L’appel à la sub se fait comme ceci : - Code:
-
remplace_block(source$,destination$,recherche$,remplace$) en transmettant les 4 paramètres qui ont la signification suivante : Source$ est le nom complet (nom et chemin) du fichier texte à modifier. Si le chemin est omis, le programme considère qu’il s’agit du répertoire en cours. Destination$ est le nom complet (nom et chemin) du fichier texte résultant après modification. Si le chemin est omis, le programme considère qu’il s’agit du répertoire en cours. Recherche$ est le bloc de texte à modifier. Remplace$ est le bloc de texte de remplacement. Si le fichier source est introuvable, un message d'alerte sera affiché et le programme s'arrête. Si le bloc de texte à modifier n'existe pas dans la source, le fichier destination restera inchangé. Exemple : Vous disposez du fichier texte suivant qui est enregistré sur C:\temp\invitation_source.txt - Code:
-
Chers Panoramiciens et Panoramiciennes
Pour fêter l'arrivée du compilateur Panoramic, l'association Panoramicale a le plaisir de vous inviter à son Panoramic Party, le dimanche 02 Février à partir de 16 heurs ( heure Panoramicienne)
A cette occasion, notre cher Jean Claude nous organisera un grand méchoui Panoramicien. Vous pouvez venir nombreux, vos amis sont les bienvenus. Une participation de deux SUB bien codées sera demandée.
Vous voulez remplacer toutes les occurrences de Panoramic par langage PanoramicL’appel se fait ainsi : - Code:
-
remplace_block("c:\temp\invitation_source.txt","c:\temp\invitation_destination.txt","Panoramic","langage Panoramic") Si tout va bien, vous obtenez un fichier c:\temp\invitation_destination.txt que je vous laisse découvrir le contenu. Avant d'oublier, voici le code en question : - Code:
-
REM ============================================================================ REM replace_block_of_text.bas ' remplacer n'importe quoi dans un fichier texte, par n'importe quoi REM ============================================================================ ' Exemple d'appel : remplace_block("c:\temp\invitation_source.txt","c:\temp\invitation_destination.txt","Panoramic","langage Panoramic")
REM ============================================================================
END REM ============================================================================ ' Remplacer un bloc de texte par un autre bloc de texte dans un fichier texte ' Paramètres : ' Source$ : nom du fichier texte à modifier ' Destination$ : nom du fichier texte modifié ' Recherche$ : bloc de texte à remplacer ' Remplace$ : bloc de texte de remplacement ' ============================================================================== ' Si le fichier source n'existe pas, il y aura un message d'alerte et arrêt du script ' Si le bloc de texte à remplacer n'existe pas dans le fichier source, ' le fichier destination sera identique au fichier source REM ============================================================================ SUB remplace_block(source$,destination$,recherche$,remplace$) dim_local f$,g$ f$ = "c:\temp\replace_block_of_text.vbs" g$ = chr$(34) REM ============================================================================ FILE_OPEN_WRITE 9999, f$ file_writeln 9999, "Option Explicit" file_writeln 9999, "Dim oFSO" file_writeln 9999, "Set oFSO = CreateObject(" + g$ + "Scripting.FileSystemObject" + g$ + ")" file_writeln 9999, "if oFSO.FileExists("+g$+source$+g$+") then" file_writeln 9999, "Main" file_writeln 9999, "Else" file_writeln 9999, "MsgBox " +g$+"Le fichier " + source$ +" n'existe pas."+g$+",48"+","+g$+"!!! ERREUR !!!" +g$ file_writeln 9999, "wscript.quit" file_writeln 9999, "end if" REM ============================================================================ file_writeln 9999, "Sub Main" file_writeln 9999, "Dim f, sSourceFile, sDestFile, sSearch, sReplace, sText1, sText2" file_writeln 9999, "sSourceFile = " + g$ + source$ + g$ file_writeln 9999, "sDestFile = " + g$ + destination$ + g$ file_writeln 9999, "sSearch = " + g$ + recherche$ + g$ file_writeln 9999, "sReplace = " + g$ + remplace$ + g$ file_writeln 9999, "Set f = oFSO.OpenTextFile(sSourceFile)" file_writeln 9999, "sText1 = FileReadAll(sSourceFile)" file_writeln 9999, "sText2 = Replace(sText1, sSearch, sReplace)" file_writeln 9999, "SaveToFile sText2, sDestFile" file_writeln 9999, "Wscript.Echo _" file_writeln 9999, g$ + "Texte avant : " + g$ + " & Len(sText1) & " + g$ + " caractères, " + g$ + " & _ " file_writeln 9999, g$+g$ + "texte après : " + g$ + " & Len(sText2) & " + g$ + " caractères (résultat dans " + g$ + " & sDestFile & " + g$ + ")." + g$ + " file_writeln 9999, "End Sub" REM ============================================================================ file_writeln 9999, "Function FileReadAll(sFile)" file_writeln 9999, "Dim f" file_writeln 9999, "Set f = oFSO.OpenTextFile(sFile)" file_writeln 9999, "FileReadAll = f.ReadAll" file_writeln 9999, "f.Close" file_writeln 9999, "End Function" REM ============================================================================ file_writeln 9999, "Sub SaveToFile(sText, sFile)" file_writeln 9999, "Dim f" file_writeln 9999, "Set f = oFSO.CreateTextFile(sFile)" file_writeln 9999, "f.Write sText" file_writeln 9999, "f.Close" file_writeln 9999, "End Sub" REM ============================================================================ FILE_CLOSE 9999 EXECUTE_WAIT f$ : FILE_DELETE f$ END_SUB REM ============================================================================
PS : Comme contenu du fichier source, ce n'est pas original! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 20:03 | |
| Mais si, seulement ça fait un peu juste pour le méchoui chez Jean-Claude demain. Je vais essayer de me libérer.. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 20:57 | |
| Question méchoui, je pense que Papydall est très certainement plus connaisseur que moi. Mais, question couscous, çà se discute. à propos, pour ceux qui se pointeraient, demain, chez moi, c'est OK, l'entrée est de 10€ (c'est pas cher). Le repas est de 100€ sans les vins, sans le dessert et sans le café. (Je ne parle pas des digestifs) Compte tenu du délai plus que bref qui m'est imposé, je suis contrains d'ajouter un supplément pour le billet d'avion de Papydall, et un autre supplément pour le fournisseur local qui devra me fournir un mouton dans l'urgence. Ça ne devrait pas dépasser les 300€ de supplément. Compte tenu de l'urgence, (qui n'est pas de mon fait), vous devez vous inscrire sur ce poste avant 21h (il est 20h57). | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 21:01 | |
| Bon, il est 21h et personne ne s'est inscrit, çà sera pour une autre fois. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Sam 1 Fév 2014 - 23:13 | |
| Bon, bin, merci jean Claude pour l’offre bon marché que tu nous faites mais s’il y a une proposition meilleur marché j’y adhère, moi ! Hé, à propos, personne n’a commenté ma SUB ! | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 8:43 | |
| Hello Papydall! J'ai fait une petite sub pour faire la même chose que tu nous proposes! A vous de rajouter les tests d'existence ou non des fichiers source.txt et destination.txt . J'ai essayé avec un fichier texte de plus de 10 Mo, ça fonctionne, mais presque 1 minute pour faire tout le travail. voilà le fichier source.txt: - Code:
-
Voici un petit texte d'essai:
Il était une fois un marchand de salades qui essayait de vendre des radis. Un jour, on lui amena un radis vert. Il s'écria: "Oh! Mon Dieu!, ce n'est pas un radis rouge!" Depuis ce jour, il ne vend plus que des radis noirs! Fin de l'histoire des radis. Moralité: Il vaut mieux continuer à vendre des salades que devenir marchand de radis! et voici mon code: - Spoiler:
dim a$,b$,c$ height 0,545
' Substituer le mot tapis au mot radis! b$="tapis" c$="radis"
dlist 1:file_load 1,"c:\temp\source.txt" dlist 2 fichier("c:\temp\source.txt","c:\temp\destination.txt") file_save 2,"c:\temp\destination.txt"
' Pour vérifier le résultat memo 3:width 3,580:height 3,250:file_load 3,"c:\temp\source.txt" memo 4:width 4,580:height 4,250:top 4,253:file_load 4,"c:\temp\destination.txt" end
sub fichier(source$,destination$) dim_local k for k=1 to count(1) a$=item_read$(1,k) while instr(a$,c$)>0 substitue(b$,c$) end_while item_add 2,a$ next k end_sub
sub substitue(b$,c$) dim_local i i=instr(a$,c$) if i>0 then b$=left$(a$,i-1)+b$:a$=b$+right$(a$,len(a$)-i-len(c$)+1) end_sub
Bon, il faut que je continue à vendre mes salades! Ça me reviendra moins cher que le méchoui! A+ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 10:05 | |
| Bonjour à tous les marchands de salades et à tous les spécialistes du méchoui. Même si je poste un code assez médiocre ( ! ) , il y a toujours quelqu’un qui en sort des meilleurs ! Donc je gagne à tous les coups. Merci bignono. Tes radis qui deviennent des tapis sont meilleurs que mon méchoui ; hé oui ; c’est bien ainsi et j’en suis ravi, alors merci. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 11:07 | |
| Je dois admettre que ton usine à gaz, Papydall, s'est trouvée sévèrement simplifiée par Bignono. Néanmoins, comme tu le dit, tout le monde y à gagné. Ça m'a permis de voir que sous W8 il n'y a pas de C:\temp, mais il y a C:\Windows\temp. A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 11:13 | |
| ? Je suis sous W7, mais il me semble que c'est pareil pour tout le monde, il n'y a pas de C:\Temp d'office si on ne l'a pas créé... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 11:38 | |
| Sous XP aussi il y a du c:\Windows\temp et c’est le temp de Windows ; moi je préfère mon temp à moi ! A chacun son temp non ? Question usine à gaz, Bignono n’a même pas besoin d'un simple étalage. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Dim 2 Fév 2014 - 12:03 | |
| Autant pour moi, j'ai bêtement cru que ce dossier "temp" existait d'office. Bon, c'est l'heure d'attaquer la botte de radis ! A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Lun 3 Fév 2014 - 21:23 | |
| @bignono Tu vas me dire que je cherche la petite bête, mais dans ton exemple essaie de remplacer "radis" par "radis noirs"... ça boucle... Je verrais plutôt une sub du genre (tout intégré, et non pas une sub qui en appelle une autre): - Code:
-
SUB Remplace(b$,c$,source$,destination$) ' remplacer la séquence b$ par c$ dans le fichier source$, résultat dans le fichier destination$ dim_local a$,aa$,k%,u% file_open_read 1,source$: file_open_write 2,destination$ while file_eof(1) = 0 file_readln 1,a$ k% = INSTR(a$, b$) WHILE k% > 0 a$ = LEFT$(a$, k%-1)+c$+MID$(a$,k%+LEN(b$),500) u% = k%+LEN(c$): aa$ = MID$(a$, u%, 500) k% = INSTR(aa$, b$): IF k% = 0 THEN EXIT_WHILE k% = k% + u% -1 END_WHILE file_writeln 2,a$ end_while file_close 1: file_close 2 end_sub | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Mar 4 Fév 2014 - 8:52 | |
| Bonjour JL35, Tu as tout à fait raison de chercher la petite bête! Cela prouve que mon code n'était pas infaillible. Donc, j'ai revu ma copie! Et pour ce faire j'ai créé un nouveau fichier source pour transformer mes "radis" en "radis noir", que voilà: - Code:
-
Voici un petit texte d'essai:
1 radis + 1 radis + 1 radis + 1 radis + 1 radis = 5 radis. Et combien font 10 x 5 radis? Sûrement pas 50 radis! Ni 10 radis + 10 radis + 10 radis + 10 radis + 10 radis! Cela fait tout simplement une botte de radis!
une fois transformé, cela devient: - Code:
-
Voici un petit texte d'essai:
1 radis noirs + 1 radis noirs + 1 radis noirs + 1 radis noirs + 1 radis noirs = 5 radis noirs. Et combien font 10 x 5 radis noirs? Sûrement pas 50 radis noirs! Ni 10 radis noirs + 10 radis noirs + 10 radis noirs + 10 radis noirs + 10 radis noirs! Cela fait tout simplement une botte de radis noirs!
Voici mon code source revu et corrigé : - Code:
-
dim b$,c$ height 0,545
' Substituer les mots "radis noirs" au mot "radis"! b$="radis" : c$="radis noirs"
remplace(b$,c$,"c:\temp\source.txt","c:\temp\destination.txt")
' Pour vérifier le résultat memo 3:width 3,580:height 3,250:file_load 3,"c:\temp\source.txt" memo 4:width 4,580:height 4,250:top 4,253:file_load 4,"c:\temp\destination.txt" end
SUB Remplace(b$,c$,source$,destination$) ' remplacer la séquence b$ par c$ dans le fichier source$, résultat dans le fichier destination$ dim_local a$,d$,k,h file_open_read 1,source$ : file_open_write 2,destination$ while file_eof(1)=0 file_readln 1,a$ k=instr(a$,b$) : d$=right_pos$(a$,k+len(b$)) repeat if k>0 a$=left$(a$,k-1)+c$+d$ : k=instr_pos(a$,d$,1) : h=instr(d$,b$) if h>0 k=k+h-1:d$=right_pos$(a$,k+len(b$)) else k=0 end_if end_if until k=0 file_writeln 2,a$ end_while file_close 1 : file_close 2 end_sub Après, vous avez le choix. - Ou vous renommez destination.txt en source.txt et vous continuez à transformer vos radis en radis noirs: cela donne des radis noirs noirs, puis des radis noirs noirs noirs, etc... - Ou alors vous renommez destination.txt en source.txt et dans le code vous inversez b$ et c$ soit b$="radis noirs" et c$="radis" et par miracle vous retrouvez le premier texte d'origine! J'ai vérifié aussi si mes radis se transformait en tapis! Ouf! Quelle histoire! Bon je remballe mon " /> pour continuer à vendre mes " /> A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre Mar 4 Fév 2014 - 13:36 | |
| On frôle l'indigestion de radis, mais j'aime beaucoup mieux comme ça ! Ce problème de remplacement d'une chaîne par une autre qui contient la première ça revient régulièrement... Comme les radis...
Bon, je ne vais pas être radin, je te mets un 10/10 Après l'Enfer, le (Pa)radis (je me demande s'il y en a là-bas... des radis... malgré le nom...) | |
| | | Contenu sponsorisé
| Sujet: Re: Remplacer une sous-chaîne de caractères par une autre | |
| |
| | | | Remplacer une sous-chaîne de caractères par une autre | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |