Parsing di date

Sto facendo un import di un file e mi ritrovo con date del tipo:
"15-OTT-98, “5-GEN-99”, come faccio a rendere queste pseudo date in
tipo date valide?

Creati un mapping dei mesi ed un metodo per il parsing personalizzato.

MONTHS = {
  'GEN' => 01,
  'FEB' => 02,
  ...
}

def dateparse(input)
  tokens = input.split('-')
  Date.new(tokens[2].to_i, MONTHS[tokens[1]], tokens[0].to_i)
end

dateparse('15-OTT-98')

– Simone

On Thu, May 19, 2011 at 10:13 AM, Mauro [email protected] wrote:

Sto facendo un import di un file e mi ritrovo con date del tipo:
"15-OTT-98, “5-GEN-99”, come faccio a rendere queste pseudo date in
tipo date valide?


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Simone C.
Application Developer

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Skype: weppos

To’, avanzavano 2 minuti… prova a vedere questa classe come spunto.

Ciao ciao
Paolo

On 19 May 2011 10:20, Simone C. [email protected] wrote:

Date.new(tokens[2].to_i, MONTHS[tokens[1]], tokens[0].to_i)

"15-OTT-98, “5-GEN-99”, come faccio a rendere queste pseudo date in
Simone C.


“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

On 19 May 2011 08:20, Simone C. [email protected] wrote:

Date.new(tokens[2].to_i, MONTHS[tokens[1]], tokens[0].to_i)
end

dateparse(‘15-OTT-98’)

Grazie mille.
Una cosa non mi e’ mai stata chiara per le date.
Il mio locale e’ :it in tutte le mie app.
Nella tabella e’ indiffererente se inserisco la data in formato:
“2009-05-11” o in formato “11/05/1009”?

2011/5/19 Mauro [email protected]:

On 19 May 2011 08:32, Paolo P. [email protected] wrote:

To’, avanzavano 2 minuti… prova a vedere questa classe come spunto.
date_normalizer.rb · GitHub
Sembra faccia al caso mio, scusa l’ignoranza, per poterla utilizzare
L’ho scritta apposta per la mail :stuck_out_tongue:

all’interno della rails app dovrei creare un helper?
Guarda, io farei cos. prenderei i metodi della classe e li metterei
nell’application helper cos visibile ovunque.

Pensate sia abbastanza utile come cosa da creare una gemma? (dopo aver
scritto la classe in modo pi robusto)

Cheers
Paolo


“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

On Thu, May 19, 2011 at 10:32 AM, Mauro [email protected] wrote:

Nella tabella e’ indiffererente se inserisco la data in formato:
“2009-05-11” o in formato “11/05/1009”?

No. Di default quasi tutti i parser, incluso quello ruby, riconoscono
due
tipi di date

  • ISO (~ anno, mese, giorno)
  • EN/US (~ mese, giorno, anno)

Se tu passi una data in formato italiano (giorno, mese, anno), avrai un
comportamento imprevedibile.
Infatti, se il mese ed il giorno non sono intercambiabili (24/09/2000)
allora il parsing probabilmente avr successo.
Se i valori sono intercambiabili (04/05/2000 dove 05 maggio) allora la
data verr quasi sicuramente convertita in 5 Aprile 2000.

Ti consiglio (una o pi alternative):

  • Di usare un parsing che consenta di specificare il formato (come
    Date.strptime, ma solo da 1.9)
  • Di convertire la data in un formato univoco
  • Di usare formati internazionali per la rappresentazione interna


Simone C.
Application Developer

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Skype: weppos

2011/5/19 Simone C. [email protected]:

  • EN/US (~ mese, giorno, anno)
  • Di usare un parsing che consenta di specificare il formato (come
    Date.strptime, ma solo da 1.9)

Perche’ da 1.9, strptime funziona anche con la 1.8, l’ho provato ora.

On 19 May 2011 08:32, Paolo P. [email protected] wrote:

To’, avanzavano 2 minuti… prova a vedere questa classe come spunto.
date_normalizer.rb · GitHub

Sembra faccia al caso mio, scusa l’ignoranza, per poterla utilizzare
all’interno della rails app dovrei creare un helper?

2011/5/19 Paolo P. [email protected]:

2011/5/19 Mauro [email protected]:

On 19 May 2011 08:32, Paolo P. [email protected] wrote:

To’, avanzavano 2 minuti… prova a vedere questa classe come spunto.
date_normalizer.rb · GitHub
Sembra faccia al caso mio, scusa l’ignoranza, per poterla utilizzare
L’ho scritta apposta per la mail :stuck_out_tongue:

Eh scrivi codice come mangi allora, beato te, io purtroppo non ho
questa capacita’, per scrivere due righe di codice ci metto molto
tempo.

2011/5/19 Mauro [email protected]:
[snip]

Guarda, io farei cos. prenderei i metodi della classe e li metterei
nell’application helper cos visibile ovunque.

Siccome l’import che devo fare va fatto solo una volta pensavo, anche
se non e’ ortodosso, di mettere tutto nel seed.rb.
Mmmh… perch non crei un task rake all’uopo?
Lo metti in lib/tasks, lo chiami “mio_import_task.rb”. Metti il codice
che legge da dove sai tu, chiama il metodo di conversione in un
namespace opportuno (che ne so import:raw)
namespace :import do
desc ‘Metti una descrizione qui’
task :raw do
metti qui il tuo codice
done
end

Una soluzione pi pulita e che ti permette di rieseguire l’import
magari a seguito di un drop della tabella o chiss che altro.

Just my 0.02
Paolo

“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

2011/5/19 Mauro [email protected]:

Sembra faccia al caso mio, scusa l’ignoranza, per poterla utilizzare
L’ho scritta apposta per la mail :stuck_out_tongue:
Eh scrivi codice come mangi allora, beato te, io purtroppo non ho
questa capacita’, per scrivere due righe di codice ci metto molto
tempo.
Mo’ dai… non esagerare Mauro :slight_smile:
Soprattutto, come ricordava Simone, occhio che la mia classe non fa
alcun controllo di sanit sulla data. Anzi, per dirla tutta… non
fa proprio alcun controllo.
Se c’ qualche data malformata tra quelle che vuoi importare potrebbe
fermarsi tutto.
Aggiungi tu qualche sanity check prima.

Ciao ciao
Paolo

“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

2011/5/19 Paolo P. [email protected]:

2011/5/19 Mauro [email protected]:

On 19 May 2011 08:32, Paolo P. [email protected] wrote:

To’, avanzavano 2 minuti… prova a vedere questa classe come spunto.
date_normalizer.rb · GitHub
Sembra faccia al caso mio, scusa l’ignoranza, per poterla utilizzare
L’ho scritta apposta per la mail :stuck_out_tongue:

all’interno della rails app dovrei creare un helper?
Guarda, io farei cos. prenderei i metodi della classe e li metterei
nell’application helper cos visibile ovunque.

Siccome l’import che devo fare va fatto solo una volta pensavo, anche
se non e’ ortodosso, di mettere tutto nel seed.rb.

2011/5/19 Paolo P. [email protected]:

che legge da dove sai tu, chiama il metodo di conversione in un
namespace opportuno (che ne so import:raw)
namespace :import do
desc ‘Metti una descrizione qui’
task :raw do
metti qui il tuo codice
done
end

Una soluzione pi pulita e che ti permette di rieseguire l’import
magari a seguito di un drop della tabella o chiss che altro.

E cosa cambia sempre un task e’.

2011/5/19 Mauro [email protected]

Perche’ da 1.9, strptime funziona anche con la 1.8, l’ho provato ora.

Hai ragione, ho confuso con Time.strptime che invece c’ solo in 1.9.

ruby-1.8.7-p334 :009 > Time.strptime
NoMethodError: undefined method `strptime’ for Time:Class


Simone C.
Application Developer

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Skype: weppos

Due consigli:

  1. evita tutti quei return ripetuti, molto poco ruby-style. usa
    implicit return.
  2. evita tutti quei m.downcase. Fai il downcase una volta e assegna
    ad
    una variabile, altrimenti nella peggiore delle ipotesi (dicembre)
    eseguirai
    11 m.downcase inutili

Se tu usi una costante come mapping, il metodo month_convert diventa 1
riga

def month_convert(m)
MONTHS[m.downcase] || m
end

– Simone

2011/5/19 Mauro [email protected]

  • ISO (~ anno, mese, giorno)

  • Di usare un parsing che consenta di specificare il formato (come
    Date.strptime, ma solo da 1.9)

Perche’ da 1.9, strptime funziona anche con la 1.8, l’ho provato ora.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Simone C.
Application Developer

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Skype: weppos

2011/5/19 Paolo P. [email protected]:

2011/5/19 Simone C. [email protected]:
[snip]

Riprendo solo per dire che ho buttato l un po’ di codice in maniera
pi organica in una gemma… nel caso servisse a qualcuno.
L’idea quella di gestire pi locales con i18n ed in futuro anche
semplici espressioni come “2 settimane fa” o “tra 3 giorni”.

Trovate il repo qui: GitHub - thesp0nge/datify: Datify is a rubygem to convert a string storing a date or a time in a proper Time ruby object
La gemma gi disponibile in una forma molto basic.

Paolo

“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com

2011/5/19 Simone C. [email protected]:

def month_convert(m)
MONTHS[m.downcase] || m
end

Grande Simone.
In effetti il metodo mont_convert stato figlio di Yank&&Paste
selvaggio. Ho eliminato solo i mesi che restavano uguali :slight_smile:

Ciao ciao
Paolo


“… static analysis is fun, again!”

life from an application security guy ~> http://thesp0nge.com