Problema con cicli

Salve a tutti,
premetto di essere un neofita di ruby.
Ecco, in breve cosa devo fare. Ho alcune cartelle con dentro un numero x
di file, mi verrà fornito un file (un csv) con una parte del nome di
alcuni file e io devo copiarli in un’altra cartella.
Io ho risolto così: creo un array con tutti i file a disposizione, leggo
le singole righe del file fornito e poi vedo se all’inerto dell’array
con tutti i file delle cartelle è presente il file.

Il codice che ho implementato è il seguente:

count = 0
for path in folder_list
tmp = path.path + “/**/.
file = Dir.glob(tmp)
files[count] = file
count += 1
end

fileline = IO.readline(path_del_file)
fileline.each do |line|
field = line.split(’;’)
files.each do |y|
y.each do |x|
tmp1 = x.upacase
tmp2 = field[1].upcase
if (tmp1.match(tmp2)) then
— copia —
end
end
end
end

Ed ecco il problema: se nel file con i nomi c’è una sola linea il tutto
funziona, ma se metto due o più linee copia solo il file dell’ultima
riga.

Qualche idea sul perchè?

Grazie per l’attenzione

Elias

Il 23/03/2011 14:13, Elias I. ha scritto:

field = line.split(’;’)

Ed ecco il problema: se nel file con i nomi c’ una sola linea il tutto
funziona, ma se metto due o pi linee copia solo il file dell’ultima
riga.

Qualche idea sul perch?

Grazie per l’attenzione

Elias

provato con la gemma Tampax???

:wink: Luca

Si si, ho provato anche la gemma Lines e CAREFREE, ma ancora non
funziona.

Mi chiedevo non è che sia il match che crea dei problemi??

Elias

Elias I. wrote in post #988869:

fileline = IO.readline(path_del_file)
fileline.each do |line|

end

Ed ecco il problema: se nel file con i nomi c’è una sola linea il tutto
funziona, ma se metto due o più linee copia solo il file dell’ultima
riga.

Se non erro IO.readline ritorna una sola linea come String.
Dovresti usare IO.readlines che le ritorna tutte come Array.
Per confondere le cose, apparentemente String ha un metodo each e quindi
il programma non ti va in errore. Ho provato con ruby 1.8.7:

$ irb

“abc”.each { |x| puts x }
abc
=> “abc”

Paolo

Il 24/03/2011 12:28, Elias I. ha scritto:

=> “abc”
(ad esempio if (tmp1.match(“APP”)) then) la risposta corretta, nel
senso che per ogni riga del file che gli passo mi d in output lo stesso
file presente nell’array con i file.

Grazie per l’aiuto

Eliasbianchi

prova a vedere se ci sono spazi o altri caratteri di tabulazione nel
file che vengono passati alla stringa, potrebbe essere il motivo per cui
il confronto non funziona.

luca.

ps: scusa la battuta precedente ma era troppo allettante :stuck_out_tongue:

Paolo M. wrote in post #989010:

Se non erro IO.readline ritorna una sola linea come String.
Dovresti usare IO.readlines che le ritorna tutte come Array.
Per confondere le cose, apparentemente String ha un metodo each e quindi
il programma non ti va in errore. Ho provato con ruby 1.8.7:

$ irb

“abc”.each { |x| puts x }
abc
=> “abc”

Paolo

Grazie Paolo.
Purtroppo uso già la funzione IO.readlines (è stato un mio errore nella
trascrizione).
Ho fatto un po’ di prove e il ciclo funziona, ma entra nel blocco “if
(tmp1.match(tmp2)) then” solo all’ultima riga. Ho anche provato a usare
altre funzioni (include? e scan), ma il risultato non cambia.
Ancora una cosa provando a fare il match con una stringa prestabilita
(ad esempio if (tmp1.match(“APP”)) then) la risposta è corretta, nel
senso che per ogni riga del file che gli passo mi dà in output lo stesso
file presente nell’array con i file.

Grazie per l’aiuto

Elias

prova a vedere se ci sono spazi o altri caratteri di tabulazione nel
file che vengono passati alla stringa, potrebbe essere il motivo per cui
il confronto non funziona.

luca.

Ho appena verificato, a parte il “;” e il carattere di nuova linea non
ci sono caratteri strani nel file.

ps: scusa la battuta precedente ma era troppo allettante :stuck_out_tongue:
Nessun problema anche se ho provato a cercare un gemma Tampax… non si
sia mai:)