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.
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:
=> “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
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.
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
Nessun problema anche se ho provato a cercare un gemma Tampax… non si
sia mai:)
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.