Forum: Italian Ruby user group ricerca testo.

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.
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 10:23
(Received via mailing list)
In un file di testo devo estrarre solo le righe contenenti la parola
Passed.
Mi sa che con riga.scan non funziona, suggeritemi qualcosa.
Dde61819bc154a68a11a41b605ff6b24?d=identicon&s=25 Giovanni Intini (Guest)
on 2007-04-02 10:37
(Received via mailing list)
File.open("test.txt") do |f|
   f.each_line {|l| puts l if l.match(/passed/i)}
end

Il giorno 02/apr/07, alle ore 10:23, Mauro Sanna ha scritto:
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 11:12
(Received via mailing list)
Il giorno lun, 02/04/2007 alle 10.36 +0200, Giovanni Intini ha scritto:
> File.open("test.txt") do |f|
>    f.each_line {|l| puts l if l.match(/passed/i)}
> end
>

Oppure, in una riga,
IO.foreach("test.txt") {|l| puts l if l.match(/Passed/)}
;-)
Dde61819bc154a68a11a41b605ff6b24?d=identicon&s=25 Giovanni Intini (Guest)
on 2007-04-02 11:15
(Received via mailing list)
Il giorno 02/apr/07, alle ore 11:11, Mauro Sanna ha scritto:

+1 per te :)
68b184c61eac5ccf10b4a84b98a190c1?d=identicon&s=25 Lawrence Oluyede (Guest)
on 2007-04-02 11:32
(Received via mailing list)
On 4/2/07, Mauro Sanna <mauro.sanna@comune.cagliari.it> wrote:
> Il giorno lun, 02/04/2007 alle 10.36 +0200, Giovanni Intini ha scritto:
> > File.open("test.txt") do |f|
> >    f.each_line {|l| puts l if l.match(/passed/i)}
> > end
> >
>
> Oppure, in una riga,
> IO.foreach("test.txt") {|l| puts l if l.match(/Passed/)}
> ;-)

Aggiungo:

http://www.oreillynet.com/ruby/blog/2007/03/gettin...

Penso che possa tornare utile all'OP
28c29f97569429d35882fdabf09f83ee?d=identicon&s=25 Massimiliano Mirra (Guest)
on 2007-04-02 11:33
(Received via mailing list)
On 4/2/07, Mauro Sanna <mauro.sanna@comune.cagliari.it> wrote:
> In un file di testo devo estrarre solo le righe contenenti la parola
> Passed.
> Mi sa che con riga.scan non funziona, suggeritemi qualcosa.

Forse non ho capito il problema incontrato con scan(), comunque:

File.read('nomefile').scan(/^.*?Passed.*?$/)



--
Massimiliano Mirra
code: http://dev.hyperstruct.net
blog: http://blog.hyperstruct.net
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 13:25
(Received via mailing list)
Il giorno lun, 02/04/2007 alle 11.15 +0200, Giovanni Intini ha scritto:
> Il giorno 02/apr/07, alle ore 11:11, Mauro Sanna ha scritto:
>
> +1 per te :)
>
> > Oppure, in una riga,
> > IO.foreach("test.txt") {|l| puts l if l.match(/Passed/)}

adesso la cosa si fa un po piu' complicata, mi spiace chiedere qui per
queste fesserie ma la doc in rete non mi aiuta molto.
In pratica una volta filtrate in base al pattern "Passed" ottengo una
serie di righe di testo di questo tipo:

"Mar 28 06:26:03 mail1 amavis[534]: (00534-02-6) Passed,
<root@azienda.it> -> <prova@azienda1.it>, Message-ID:
<20070328042603.0A3DD17DB5@mail1.comune.cagliari.it>, Hits: -\n"

dovrei estrapolare i due indirizzi mail per poi confrontarli con un
array.
Quello che ne e' uscito fuori e' questo obrobrio:

@a = []
@b = []

IO.foreach("mail.log") do |riga1|
    if riga1.match(/Passed/)
      @a = riga1.split(',')
      @b = @a[1].split("->")
      r = @b[0].gsub(" <","")
      r1 = r.gsub("> ","")
      s = @b[1].gsub(" <","")
      s1 = s.gsub("> ","")
      p r1
      p s1
    end

sicuramente ruby ha delle soluzioni piu' eleganti......
Dde61819bc154a68a11a41b605ff6b24?d=identicon&s=25 Giovanni Intini (Guest)
on 2007-04-02 13:27
(Received via mailing list)
Regular Expressions are you friend.

Il giorno 02/apr/07, alle ore 13:24, Mauro Sanna ha scritto:
22db95dcabb31b10d0e8a42b2e664b08?d=identicon&s=25 Domenico Delle Side (Guest)
on 2007-04-02 13:36
(Received via mailing list)
On Lun, Aprile 2, 2007 13:24, Mauro Sanna wrote:

  > "Mar 28 06:26:03 mail1 amavis[534]: (00534-02-6) Passed,
  > <root@azienda.it> -> <prova@azienda1.it>, Message-ID:
  > <20070328042603.0A3DD17DB5@mail1.comune.cagliari.it>, Hits: -\n"

Potresti estrapolare il secondo indirizzo direttamente con una
espressione
regolare, qualcosa del tipo (non testato):

IO.foreach("mail.log") do |riga1|
  puts riga1.match(/Passed/).gsub(/.*->.*<(.*@.*)>,.*/, '\1')
end

Ovviamente, il pattern usato è "di fantasia", giusto per darti un'idea.


Ciao,
Nico
Ba479af4eac156bce6c989584dc723d2?d=identicon&s=25 Andrea Forni (gendag)
on 2007-04-02 16:08
(Received via mailing list)
Mauro Sanna wrote:
> sicuramente ruby ha delle soluzioni piu' eleganti......

IO.foreach("mail.log") do |riga1|
     if riga1.match(/Passed/)
       m = str.match(/<(.*?@.*?)> -> <(.*?@.*?)>/)
       puts m[1]
       puts m[2]
     end
end

Nota: nella regexpr il frammento ".*?" fa match con una sequenza
qualsiasi di caratteri qualsiasi di lunghezza MINIMA, se togli il "?"
la sequenza diventa massima dal momento che "*" e' greedy, piglia cioe'
tutto!

ciao!

Genag
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 16:39
(Received via mailing list)
> la sequenza diventa massima dal momento che "*" e' greedy, piglia cioe'
> tutto!

Questo non l'ho trovato in nessuna doc sulle regexp.
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 17:03
(Received via mailing list)
Il giorno lun, 02/04/2007 alle 16.07 +0200, Gendag ha scritto:
>
> Nota: nella regexpr il frammento ".*?" fa match con una sequenza
> qualsiasi di caratteri qualsiasi di lunghezza MINIMA, se togli il "?"
> la sequenza diventa massima dal momento che "*" e' greedy, piglia cioe'
> tutto!

Funziona ottimamente solo che in situazioni come queste
(?) -> <giuseppe.chirri@comune.cagliari.it> si incasina.
Ho potuto verificare che invece il metodo scan al posto di match
funziona meglio.
Ba479af4eac156bce6c989584dc723d2?d=identicon&s=25 Andrea Forni (gendag)
on 2007-04-02 17:45
(Received via mailing list)
Mauro Sanna wrote:
> Questo non l'ho trovato in nessuna doc sulle regexp.

Nel libro "Programming Ruby - 2nd", pagina 310 in fondo
Ba479af4eac156bce6c989584dc723d2?d=identicon&s=25 Andrea Forni (gendag)
on 2007-04-02 17:53
(Received via mailing list)
Mauro Sanna wrote:
>
> Funziona ottimamente solo che in situazioni come queste
> (?) -> <giuseppe.chirri@comune.cagliari.it> si incasina.
> Ho potuto verificare che invece il metodo scan al posto di match
> funziona meglio.

Ma qual e' la string ache ti da dei problemi?

ciao!

Gendag
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-02 18:17
(Received via mailing list)
Il giorno lun, 02/04/2007 alle 17.52 +0200, Gendag ha scritto:
> Mauro Sanna wrote:
> >
> > Funziona ottimamente solo che in situazioni come queste
> > (?) -> <giuseppe.chirri@comune.cagliari.it> si incasina.
> > Ho potuto verificare che invece il metodo scan al posto di match
> > funziona meglio.
>
> Ma qual e' la string ache ti da dei problemi?

Quella che ti ho citato,
(?) -> <mail@comune.xxx.it>
trova quel punto interrogativo al posto dell'indirizzo mail e mi da
l'errore:
my_new_class.rb:24: undefined method `[]' for nil:NilClass
(NoMethodError)
        from my_new_class.rb:21:in `foreach'
        from my_new_class.rb:21
Ba479af4eac156bce6c989584dc723d2?d=identicon&s=25 Andrea Forni (gendag)
on 2007-04-03 10:23
(Received via mailing list)
Mauro Sanna wrote:
> Quella che ti ho citato,
> (?) -> <mail@comune.xxx.it>
> trova quel punto interrogativo al posto dell'indirizzo mail e mi da
> l'errore:
> my_new_class.rb:24: undefined method `[]' for nil:NilClass
> (NoMethodError)
>         from my_new_class.rb:21:in `foreach'
>         from my_new_class.rb:21

pensavo che gli indirizzi e-mail fossero tutti della forma:
"<indirizzo1> -> <indirizzo2>". Se c'e' anche la possibilita' che sia
"(?) -> <indirizzo2>" allora basta modificare la regexp nel metodo
match:

/(?:(?:<(.*?@.*?)>)|\(\?\)) -> <(.*?@.*?)>/

ciao!

gendag
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-04 09:27
(Received via mailing list)
> pensavo che gli indirizzi e-mail fossero tutti della forma:
> "<indirizzo1> -> <indirizzo2>". Se c'e' anche la possibilita' che sia
> "(?) -> <indirizzo2>" allora basta modificare la regexp nel metodo
> match:
>
> /(?:(?:<(.*?@.*?)>)|\(\?\)) -> <(.*?@.*?)>/

eh le regexp non riesco a farmele entrare in testa :-(
Thank you.
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-04 09:31
(Received via mailing list)
Il giorno mar, 03/04/2007 alle 10.22 +0200, Gendag ha scritto:
> pensavo che gli indirizzi e-mail fossero tutti della forma:
> "<indirizzo1> -> <indirizzo2>". Se c'e' anche la possibilita' che sia
> "(?) -> <indirizzo2>" allora basta modificare la regexp nel metodo
> match:
>
> /(?:(?:<(.*?@.*?)>)|\(\?\)) -> <(.*?@.*?)>/

In effetti ci avevo gia' provato, avevo fatto questo
/<(.*?@.*?)>)|\(\?\) -> <(.*?@.*?)>/ ma non mi funzionava.
Perche' quei (?:(?: iniziali?
Ba479af4eac156bce6c989584dc723d2?d=identicon&s=25 Andrea Forni (gendag)
on 2007-04-04 09:58
(Received via mailing list)
Mauro Sanna wrote:
>> /(?:(?:<(.*?@.*?)>)|\(\?\)) -> <(.*?@.*?)>/
>
> In effetti ci avevo gia' provato, avevo fatto questo
> /<(.*?@.*?)>)|\(\?\) -> <(.*?@.*?)>/ ma non mi funzionava.
> Perche' quei (?:(?: iniziali?

Esistono due tipi di parantesi per raggruppare porzioni di
regexp:
1. le parentesi normali, per esempio quelle in "(.*?@.*?)" creano
una back reference, cioe' quella porzione di regexp puo':
     a. essere ripetuta in altre parti della regexp usando \1, \2,
     \3, ecc...
     b. essere acceduta dall'esterno tramite le variabili $1, $2,
        $3, ecc... o se usi un oggetto MatchData m, tramite m[1], m[2],
        m[3], ecc...

2. le parentesi (?: regexp ), per esempio quelle in "(?:<(.*?@.*?)>)",
permettono di raggruppare le porzioni di regexp senza creare back
reference. Le ho tuilizzate, cosi' posso raggruppare parti di regexp
ma esistono sempre e solo due back reference agli indirizzi e-mail
da estrarre.

ciao!

Gendag
B3220b2d1a7c169c9bd3d46af9e5d5ad?d=identicon&s=25 Stefano Cobianchi (Guest)
on 2007-04-04 11:30
(Received via mailing list)
On Apr 2, 2007, at 4:38 PM, Mauro Sanna wrote:

>
> Questo non l'ho trovato in nessuna doc sulle regexp.

http://www.oreilly.com/catalog/regex/
l'unica doc che serve :-)
09f38ff69d24a477bd0bc340eeeda432?d=identicon&s=25 Mauro Sanna (Guest)
on 2007-04-04 11:30
(Received via mailing list)
> la sequenza diventa massima dal momento che "*" e' greedy, piglia cioe'
> tutto!

Ho visto la pagina di programming ruby dove si parla di questo ma non
l'ho capito :-(
4c8f1734faea8b7b2db0ea4bf4ebbf66?d=identicon&s=25 Matteo Vaccari (Guest)
on 2007-04-15 18:34
(Received via mailing list)
On 4/4/07, Mauro Sanna <mauro.sanna@comune.cagliari.it> wrote:
> > la sequenza diventa massima dal momento che "*" e' greedy, piglia cioe'
> > tutto!
>
> Ho visto la pagina di programming ruby dove si parla di questo ma non
> l'ho capito :-(

La faccenda del greedy e non greedy è un po' da magia nera.  Se ho
un'espressione regolare /.*/ la sequenza più piccola che matcha è la
stringa vuota.

Una maniera più ortodossa di fare la stessa cosa, se ad esempio vuoi
matchare

  aaa <pippo@pluto.com> bbb <topolino@minni.com> ccc

e estrarre i due indirizzi email, è di usare al posto di .* questa
espressione: [^>]* che matcha fino a quando non trova un "maggiore".

Per tornare al tuo problema: se il tuo problema è trovare tutte le
righe che contengono "Passed" ed estrarre i due indirizzi e farci
qualcosa, io farei
così:
IO.foreach("mail.log") do |line|
  if line =~ /Passed.*<([^>]*)>.*<([^>]*)>/
    primo_indirizzo = $1
    secondo_indirizzo = $2
    process primo_indirizzo, secondo_indirizzo
  end
end

o anche

IO.foreach("mail.log") do |line|
  process($1, $2) if line =~ /Passed.*<([^>]*)>.*<([^>]*)>/
end

E' più elegante sì o no? :)

M
This topic is locked and can not be replied to.