Gå til innhold

Anbefalte innlegg

Eg har tenkt å parse denne stringen: "13112007"

 

sånn at @day = 13, @month = 11 og @year = 2007

 

Korleis kan det bli gjort?

 

Trur eg fant det ut, spørs om det er korrekt måte? :)

Det funker ijallefall...

 

Sånn blei det

 

@a = @params[:timestamp]
@day = @a.slice(0,2)
@month = @a.slice(2,2)
@year = @a.slice(4,4)

Lenke til kommentar
Videoannonse
Annonse

Ja, det var en en klar og eksplisitt måte. Prøvde å komme på en one-liner og endte opp med dette:

 

e, day, month, year = *@params[:timestamp].split(/(..)(..)(....)/)

En kort forklaring:

- Stringen deles opp hver gang regex-utrykket matcher

- * (splat) tilegner et array-element til hver variabel

- Split returnerer en array med alle delene

- e er bare for å bli kvitt et unødvendig empty string treff. En regex-ekspert kan kanskje si oss hvordan man unngår dette.

 

En fordel med å samle verdiene i en array er at du kan gjøre videre prosessering, for eksempel:

irb(main):127:0> e, day, month, year = "13112007".split(/(..)(..)(....)/).map{|s| s.to_i}
=> [0, 13, 11, 2007]
irb(main):128:0> year
=> 2007

Lenke til kommentar

Blacktower sin løsning bruker RegEx og blir dermed litt treigere enn din...

 

              user       system     total      real
siDDIs:       2.560000   0.220000   2.780000   (2.802457)
blacktower:   4.830000   0.130000   4.960000   (4.970104)

(Etter 1 million kjøringer)

Lenke til kommentar

Stor og stor.. Husk at dette er etter 1 million kjøringer :)

require 'benchmark'

def siddis(h = "13112007")
 @day = h.slice(0,2)
 @month = h.slice(2,2)
 @year = h.slice(4,4)
end

def blacktower(h = "13112007")
 e, @day, @month, @year = h.split(/(..)(..)(....)/)
end

n = 1_000_000
Benchmark.bm do |x|
 x.report("siDDIs:") { n.times { siddis } }
 x.report("blacktower:") { n.times { blacktower } }
end

 

EDIT: Dokumentasjon.

 

Husk at http://ruby-doc.org/core og http://ruby-doc.org/stdlib har mange kjekke ting :)

Endret av Judofyr
Lenke til kommentar

Treg og tregt fru blom, jeg vil nå se at det var forbausende raskt. :)

 

La oss sammenligne med en typisk forespørsel

 

Processing AccountController#list (for 10.1.202.159 at 2007-03-09 17:42:21) [GET]

  Session ID: 0d632b78f62854bf12075695bd9229ba

  Parameters: {"action"=>"list", "role"=>"4", "controller"=>"account"}

Rendering  within layouts/application

Rendering account/list

Completed in 0.03173 (31 reqs/sec) | Rendering: 0.01756 (55%) | DB: 0.00984 (31%) | 200 OK [http://sqaweb/account/role/4/list]

Når en request tar ~32 ms, spiller det relativt liten rolle om noe du skal gjøre én gang i controlleren tar 0,0025 ms eller 0.0050 ms.

Lenke til kommentar
  - e er bare for å bli kvitt et unødvendig empty string treff. En regex-ekspert kan kanskje si oss hvordan man unngår dette.

 

Man trenger ikke være noen regex-ekspert for å gjøre dette..

 

day, month, year = *params[:timestamp].split(/(..)(..)(....)/)[1..-1]

 

@params er forresten fy-fy, bruk params..

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...