Mi scuso per la banalità della domanda ma sono fuso ed è una cosa
abbastanza urgente.
Mi trovo nella situazione di avere un file con un contenuto tipo:
riga intestazione 1
riga intestazione x
= da qui =
bla bla bla
blu blu blu
bli bli bli
= a qui =
riga fondo pagina 1
riga fondo pagina 2
Vorrei riuscire a estrarre le righe comprese tra “= da qui =” e “= a
qui =” (ovviamente le stringhe sono più complesse ma identificabili
univocamente), estremi esclusi.
Mi scuso per il ritardo e ringrazio tutti quanti per le soluzioni e
gli ottimi spunti.
Mi metterò ad approfondire le strade che mi avete indicato per trovare
la soluzione migliore per le mie
necessità.Grazie ancora.
Per prima cosa grazie per la velocissima risposta ma …
l’ho già anticipato che sono fuso ma cercando di far funzionare da irb
il tuo esempio non sono riuscito a cavare un ragno dal buco …
ho dovuto anche definire prima del ciclo start=stop=false o mi beccavo
un undefined, ciò non ostante:
irb(main):007:0> start=stop=false
=> false
irb(main):008:0> File.new(“prova.txt”).each_line do |line|
irb(main):009:1* the_goodies << line if start and not stop
irb(main):010:1> start = true if “= da qui =” == line
irb(main):011:1> stop = true if “= a qui =” == line
irb(main):012:1> end
=> #<File:prova.txt>
irb(main):013:0> the_goodies
=> []
per paura di aver sbagliato file ho provato ad aggiungere un puts line
come prima istruzione del ciclo e così mi stampa tutte le righe del
file (come file di prova ho usato quello che ho postato prima) ma
the_goodies rimane vuota
in genere ignoro le performance in favore della leggibilità. ottimizzo
dopo
dove serve, se serve.
detto questo capita che in certi casi le regexp siano la soluzione più
leggibile. davvero!
On 3/9/07, Federico G. [1]<[email protected]> wrote:
Per prima cosa grazie per la velocissima risposta ma ...
chiaro scuro ti ha dato una risposta che funziona con gli
aggiustamenti giÃ
segnalati, ma giusto per non dimenticare l'esistenza delle
espressioni
regolari (bastarde ma utilissime, ecco tutorial secondo me ottimo
per
iniziare: [2]http://fido.altervista.org/RegExp/regex.html) potresti
usare uno
snippet del genere:
START, STOP = "= da qui =", "= a qui ="
dati_filtrati = File.read('dati.txt
').scan(/#{START}[\r\n](.*?)[\n\r]#{STOP}/m)[0]
NB: occorre solo attenzione nell'effettuare l'escape dei caratteri
considerati speciali nelle espressioni regolari nel caso di
sostituzione dei
valori di START e STOP.
_______________________________________________________________________
Per prima cosa grazie per la velocissima risposta ma …
chiaro scuro ti ha dato una risposta che funziona con gli aggiustamenti
giÃ
segnalati, ma giusto per non dimenticare l’esistenza delle espressioni
regolari (bastarde ma utilissime, ecco tutorial secondo me ottimo per
iniziare: http://fido.altervista.org/RegExp/regex.html) potresti usare
uno
snippet del genere:
START, STOP = “= da qui =”, “= a qui =”
dati_filtrati = File.read('dati.txt
').scan(/#{START}\r\n[\n\r]#{STOP}/m)[0]
NB: occorre solo attenzione nell’effettuare l’escape dei caratteri
considerati speciali nelle espressioni regolari nel caso di sostituzione
dei
valori di START e STOP.
Una domanda che non c’entra molto forse: ma secondo voi, nella scelta
tra una soluzione brute-force, come quella di chiaro-scuro e una
basata sui regexp, come quella di daniele, qual è la più performante?
Ovviamente dipende dalla complessità dell’espressione regolare o
dell’algoritmo custom scelto per analizzare lo stesso testo, ma in
generale la soluzione con le regexp può risultare più performante in
moltissimi casi e ciò vale ancor di più per Ruby visto che le
espressioni
regolari sono processate a livello di libreria interna all’interprete,
dando
un’ulteriore spinta alla performance.
Allego un breve script realizzato con il modulo Benchmark per testare le
due
soluzioni. Le ho solo leggermente sistemate: nel caso della regexp ho
eliminato la concatenazione con le costanti visto che rallenta in
maniera
allucinante, ho aggiustato la soluzione di chiaro scuro visto che mi
sono
accorto che includeva nel risultato anche “= a qui =” e infine ho fatto
sì
che entrambe producessero come risultato finale una stringa. Il
risultato
sul mio computer (P4 3.0 GHz - Ruby 1.8.5 - WinXP) è questo:
Come fate voialtri? regexp all the way o un po’ qua e là e solo quando
non è conveniente fare altrimenti?
Per quanto mi riguarda, regexp all the way e soluzione “custom” solo
quando
non è conveniente fare altrimenti. Ne guadagno in velocità di sviluppo e
anche in mantenibilità del codice (almeno per me, che sono abituato) e,
spesso, ci si guadagna anche in performance.
Per prima cosa grazie per la velocissima risposta ma …
l’ho già anticipato che sono fuso ma cercando di far funzionare da irb
il tuo esempio non sono riuscito a cavare un ragno dal buco …
ho dovuto anche definire prima del ciclo start=stop=false o mi beccavo
un undefined, ciò non ostante:
sorry, devi mettere line.chomp! subito dopo |line|
devi togliere il fastidioso \n a fine riga