Le choix de l'une ou l'autre des méthodes est fonction de la puissance de la machine et de la quantité de mémoire RAM disponible.
Prenons l'exemple d'un fichier test.txt qui contient :
apizeaumontrtyuiop^poipieruytrdesqpierrewsdfghjkl:;,nbvcxcvbn,;pierre.aumontazertyuiqwdAQ<ertyhuhgfwsdfdsazerth
Recherche de la chaine de caractères directement dans le fichier :
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 31 32 33 34
| clear
string_to_find = "pierre.aumont"
num_char = 1
fd = mopen('test.txt','rb')
while ~meof(fd) do
M = mgetstr(1, fd)
if M == part(string_to_find,num_char) then
if num_char == length(string_to_find) then
idx_string_to_find = mtell(fd) - length(string_to_find) + 1
break
else
num_char = num_char + 1
end
else
num_char = 1
end
end
mclose(fd)
if num_char == length(string_to_find) then
str = "apizeaumontrtyuiop^poipieruytrdesqpierrewsdfghjkl:;,nbvcxcvbn,;pierre.aumontazertyuiqwdAQ<ertyhuhgfwsdfdsazerth"
disp(part(str, idx_string_to_find:idx_string_to_find+length(string_to_find)-1))
else
disp("String not found")
end |
Chargement du fichier en mémoire avant recherche de la chaine de caractères :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| clear
string_to_find = "pierre.aumont"
x = fileinfo('test.txt')
fd = mopen('test.txt','rb')
M = mgetstr(x(1), fd)
mclose(fd)
idx_string_to_find = strindex(M, string_to_find)
if isempty(idx_string_to_find) then
disp("String not found")
else
str = "apizeaumontrtyuiop^poipieruytrdesqpierrewsdfghjkl:;,nbvcxcvbn,;pierre.aumontazertyuiqwdAQ<ertyhuhgfwsdfdsazerth"
disp(part(str, idx_string_to_find:idx_string_to_find+length(string_to_find)-1))
end |
La première méthode est relativement naïve. On peut l'optimiser en lisant plusieurs caractères à la fois, plutôt que caractère par caractère.
Il faut juste gérer le cas où la chaine recherchée est commune à plusieurs blocs lus.
Je pense que mgetstr est équivalent à mgeti en terme de mémoire consommée. Mais je ne peux pas le prouver car la fonction whos ne me renvoi pas la taille des variables sur ma machine
Sinon, on peut remplacer les codes comme ceci :
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 31 32 33 34 35
| clear
string_to_find = "pierre.aumont"
string_to_find_ascii = ascii(string_to_find)
num_char = 1
fd = mopen('test.txt','rb')
while ~meof(fd) do
M = mgeti(1, "c", fd)
if M == string_to_find_ascii(num_char) then
if num_char == length(string_to_find) then
idx_string_to_find = mtell(fd) - length(string_to_find) + 1
break
else
num_char = num_char + 1
end
else
num_char = 1
end
end
mclose(fd)
if num_char == length(string_to_find) then
str = "apizeaumontrtyuiop^poipieruytrdesqpierrewsdfghjkl:;,nbvcxcvbn,;pierre.aumontazertyuiqwdAQ<ertyhuhgfwsdfdsazerth"
disp(part(str, idx_string_to_find:idx_string_to_find+length(string_to_find)-1))
else
disp("String not found")
end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| clear
string_to_find = "pierre.aumont"
x = fileinfo('test.txt')
fd = mopen('test.txt','rb')
M = mgeti(x(1), "c", fd)
mclose(fd)
idx_string_to_find = strindex(char(M), string_to_find)
if isempty(idx_string_to_find) then
disp("String not found")
else
str = "apizeaumontrtyuiop^poipieruytrdesqpierrewsdfghjkl:;,nbvcxcvbn,;pierre.aumontazertyuiqwdAQ<ertyhuhgfwsdfdsazerth"
disp(part(str, idx_string_to_find:idx_string_to_find+length(string_to_find)-1))
end |
Partager