Découper une chaîne en sous-chaînes


#1

Bonsoir,

Aurriez-vous une idée pour découper en plusieurs blocs fixes une chaîne
dont le nombre de caractères est variable ?

Voci un exemple :

Cette variable contient 33 caractères

string = “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”

J’aurais besoin de la découper. En supposant que je veuille la découper
en blocs de 16 caractères, cela me ferait 3 blocs : tab[0], tab[1] et
tab[2].

puts tab[0]
=>DKZksi2kz2l20SKD

puts tab[1]
=>?Z922?DS82ND2?D9

puts tab[2]
=>2

Je précise que le nombre de caractères de string peut varier (selon
l’utilisation du script) et donc, par conséquent, le nombre de blocs
peut varier aussi.

Merci pour votre aide.


#2

Bonjour,

je pense qu’il te faut l’expression régulière suivante : /(.{1,16})/

[zifro@september ~]irb
irb(main):001:0> s = “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
=> “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
irb(main):002:0> s.scan /(.{1,16})/
=> [[“DKZksi2kz2l20SKD”], ["?Z922?DS82ND2?D9"], [“2”]]

Pour les questions purement Ruby, tu peux également adresser ta
question sur la liste publique de Ruby France :
http://groups.google.com/group/rubyfr-public

Bon week-end !


Guillaume “Zifro” DESRAT
Secrétaire de l’association Ruby France
http://www.rubyfrance.org/


#3

Merci pour l’aide. J’ai essayé mais pour le moment j’ai l’impression que
ça ne fonctionne pas :

C:\InstantRails\rails_apps>irb
irb(main):001:0> s = “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
=> “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
irb(main):002:0> s.scan /(.1,16)/
=> []

Par rapport aux expressions réguliaires, il faudrait que l’algo soit le
plus léger possible (par rapport à la charge CPU). En effet, cette algo
pourrait par exemple être utilisé pour découper de très grandes chaînes.
C’est pour cela que je ne sais pas si les expressions régulières ne sont
appropriées (car en PHP, elles concomment bcp de temps de calcul).

Quoi qu’il en soit, j’avais essayé de bricoler un script pour y arriver
(sans y arriver :)). Le voici :

String = “123456789ABCDEFGHIJK”
Bloc = 3
cpt = 0
((String.length)/Bloc).times do
puts String[(cpt*Bloc)…((cpt+1)*Bloc)]
cpt = cpt + 1
end

Et voila ce que l’obtiens :

1234
4567
789A
ABCD
DEFG
GHIJ

D’où le problème suivant : chaque nouveau bloc contient le dernier
caractères du précédent.


#4

t5in9tao :

Merci pour l’aide. J’ai essayé mais pour le moment j’ai l’impression que
ça ne fonctionne pas :

Ben faut apprendre à faire des copier/collers alors.

C:\InstantRails\rails_apps>irb
irb(main):001:0> s = “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
=> “DKZksi2kz2l20SKD?Z922?DS82ND2?D92”
irb(main):002:0> s.scan /(.1,16)/
=> []

La version de Zifro : s.scan /(.{1,16})/

Quoi qu’il en soit, j’avais essayé de bricoler un script pour y arriver
(sans y arriver :)). Le voici :

String = “123456789ABCDEFGHIJK”

Ne pas toucher à String.

Bloc = 3
cpt = 0
((String.length)/Bloc).times do
puts String[(cpt*Bloc)…((cpt+1)*Bloc)]
cpt = cpt + 1
end

Si tu veux passer par String#slice :

str, bloc = “abcdefghijklmn0123456789” * 10 + “abc”, 5
0.step(str.length, bloc) { |offset| puts str[offset…offset + bloc] }

-- Jean-François.