Ricerca testo


#1

In un file di testo devo estrarre solo le righe contenenti la parola
Passed.
Mi sa che con riga.scan non funziona, suggeritemi qualcosa.


#2

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 S. ha scritto:


#3

Il giorno 02/apr/07, alle ore 11:11, Mauro S. ha scritto:

+1 per te :slight_smile:


#4

Il giorno lun, 02/04/2007 alle 10.36 +0200, Giovanni I. 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/)}
:wink:


#5

On 4/2/07, Mauro S. removed_email_address@domain.invalid wrote:

Il giorno lun, 02/04/2007 alle 10.36 +0200, Giovanni I. 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/)}
:wink:

Aggiungo:

http://www.oreillynet.com/ruby/blog/2007/03/getting_to_know_the_ruby_core.html

Penso che possa tornare utile all’OP


#6

On 4/2/07, Mauro S. removed_email_address@domain.invalid 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 M.
code: http://dev.hyperstruct.net
blog: http://blog.hyperstruct.net


#7

Regular Expressions are you friend.

Il giorno 02/apr/07, alle ore 13:24, Mauro S. ha scritto:


#8

On Lun, Aprile 2, 2007 13:24, Mauro S. wrote:

“Mar 28 06:26:03 mail1 amavis[534]: (00534-02-6) Passed,
removed_email_address@domain.invalid -> removed_email_address@domain.invalid, Message-ID:
removed_email_address@domain.invalid, 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


#9

Il giorno lun, 02/04/2007 alle 11.15 +0200, Giovanni I. ha scritto:

Il giorno 02/apr/07, alle ore 11:11, Mauro S. ha scritto:

+1 per te :slight_smile:

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,
removed_email_address@domain.invalid -> removed_email_address@domain.invalid, Message-ID:
removed_email_address@domain.invalid, 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…


#10

la sequenza diventa massima dal momento che “*” e’ greedy, piglia cioe’
tutto!

Questo non l’ho trovato in nessuna doc sulle regexp.


#11

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
(?) -> removed_email_address@domain.invalid si incasina.
Ho potuto verificare che invece il metodo scan al posto di match
funziona meglio.


#12

Mauro S. 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


#13

Mauro S. wrote:

Questo non l’ho trovato in nessuna doc sulle regexp.

Nel libro “Programming Ruby - 2nd”, pagina 310 in fondo


#14

Mauro S. wrote:

Funziona ottimamente solo che in situazioni come queste
(?) -> removed_email_address@domain.invalid 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


#15

Il giorno lun, 02/04/2007 alle 17.52 +0200, Gendag ha scritto:

Mauro S. wrote:

Funziona ottimamente solo che in situazioni come queste
(?) -> removed_email_address@domain.invalid 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,
(?) -> removed_email_address@domain.invalid
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:inforeach’
from my_new_class.rb:21


#16

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

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

eh le regexp non riesco a farmele entrare in testa :frowning:
Thank you.


#17

Il giorno mar, 03/04/2007 alle 10.22 +0200, Gendag ha scritto:

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

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

In effetti ci avevo gia’ provato, avevo fatto questo
/<(.?@.?)>)|(?) -> <(.?@.?)>/ ma non mi funzionava.
Perche’ quei (?:(?: iniziali?


#18

Mauro S. wrote:

Quella che ti ho citato,
(?) -> removed_email_address@domain.invalid
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:inforeach’
from my_new_class.rb:21

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

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

ciao!

gendag


#19

On Apr 2, 2007, at 4:38 PM, Mauro S. wrote:

Questo non l’ho trovato in nessuna doc sulle regexp.

http://www.oreilly.com/catalog/regex/
l’unica doc che serve :slight_smile:


#20

Mauro S. 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