Je cherchais un moyen élégant et efficace de découper une chaîne en sous-chaînes d'une longueur donnée en Ruby.
Jusqu'à présent, le mieux que j'ai pu trouver est celui-ci:
def chunk(string, size)
(0..(string.length-1)/size).map{|i|string[i*size,size]}
end
>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []
Vous voudrez peut- chunk("", n)
être revenir [""]
au lieu de []
. Si tel est le cas, ajoutez simplement ceci comme première ligne de la méthode:
return [""] if string.empty?
Recommanderiez-vous une meilleure solution?
Éditer
Merci à Jeremy Ruten pour cette solution élégante et efficace: [edit: PAS efficace!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Éditer
La solution string.scan prend environ 60 secondes pour découper 512k en morceaux de 1k 10000 fois, par rapport à la solution d'origine basée sur les tranches qui ne prend que 2,4 secondes.