Forum: Rails France Découper une chaîne en sous-chaînes...

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
t5in9tao (Guest)
on 2007-01-27 03:05
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.
Guillaume "Zifro" DESRAT (Guest)
on 2007-01-27 10:58
(Received via mailing list)
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/
t5in9tao (Guest)
on 2007-01-27 15:45
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.
Jean-François (Guest)
on 2007-01-27 16:28
(Received via mailing list)
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.
This topic is locked and can not be replied to.