У меня есть файл CSV, состоящий из двух столбцов.Как найти и заменить список имен файлов из списка
Один столбец - это старое имя файла, а другое - новое имя файла.
Я хочу заменить фактические имена файлов в папке новыми именами файлов.
Я смотрел экстенсивно, но не могу узнать, как это сделать.
Мой входной файл состоит в следующем:
New Old
Dys.FSA_BB_NEW_0204_Sp_5_HBG_fq.gz.res Cfda
Dys.FSC_Sp_BB_LC_0028_R1_30_HBG_fq.gz.res Cyffa
Dys_BB_NEW_0177_Sp_FSD.5_HBG_fq.gz.res Cyfsaff
Dys_FSE.BB_AM_0104_Sp_5_HBG_fq.gz.res afffa
Dys_FSF.AM_0068_Sp_5_HBG_fq.gz.res Cvdsd
Dys_FSG.BB_LC_261_Sp_15_HBG_fq.gz.res vsvds0
Dys_FSH.BB_LC_0047_Sp_10_HBG_fq.gz.res Cyto_vds.0
Dys_FastB_BB_LC_0028_Sp_15_HBG_fq.gz.res Cvsv
Dys_FSA_OC_AH_255_E_B1_Biopsy_30_LBG_fq.gz.res AneupvsvEFS
Dys_FSC_OC_UC_025_E_B1_Biopsy_25_LBG_fq.gz.res vdvsupDysplasticBEFS
Dys_FSD_BB_POR_0028_Biopsy_30_HBG_fq.gz.res 24vdvdS
Dys_FSH_BB_NEW_0097_Biopsy_70_HBG_fq.gz.res Avdsgf3
Dys_FSI_BB_AM_0003_Biopsy_60_LBG_fq.gz.res AnfdsfdsFS
Я полагаю, я должен создать массив хэшей первого из CSV, используя что-то вроде этого:
require 'csv'
csv_data = CSV.read '/Users/sebastianzeki/Desktop/tbb.csv'
headers = csv_data.shift.map {|i| i.to_s }
string_data = csv_data.map {|row| row.map {|cell| cell.to_s } }
array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] }
Это дает мне:
[{"New"=>"Dys.FSA_BB_NEW_0204_Sp_5_HBG_fq.gz.res", "Old"=>"Cfda"}, {"New"=>"Dys.FSC_Sp_BB_LC_0028_R1_30_HBG_fq.gz.res", "Old"=>"Cyffa"}, {"New"=>"Dys_BB_NEW_0177_Sp_FSD.5_HBG_fq.gz.res", "Old"=>"Cyfsaff"}, {"New"=>"Dys_FSE.BB_AM_0104_Sp_5_HBG_fq.gz.res", "Old"=>"afffa"}, {"New"=>"Dys_FSF.AM_0068_Sp_5_HBG_fq.gz.res", "Old"=>"Cvdsd"}, {"New"=>"Dys_FSG.BB_LC_261_Sp_15_HBG_fq.gz.res", "Old"=>"vsvds0"}, {"New"=>"Dys_FSH.BB_LC_0047_Sp_10_HBG_fq.gz.res", "Old"=>"Cyto_vds.0"}, {"New"=>"Dys_FastB_BB_LC_0028_Sp_15_HBG_fq.gz.res", "Old"=>"Cvsv"}, {"New"=>"Dys_FSA_OC_AH_255_E_B1_Biopsy_30_LBG_fq.gz.res", "Old"=>"AneupvsvEFS"}, {"New"=>"Dys_FSC_OC_UC_025_E_B1_Biopsy_25_LBG_fq.gz.res", "Old"=>"vdvsupDysplasticBEFS"}, {"New"=>"Dys_FSD_BB_POR_0028_Biopsy_30_HBG_fq.gz.res", "Old"=>"24vdvdS"}, {"New"=>"Dys_FSH_BB_NEW_0097_Biopsy_70_HBG_fq.gz.res", "Old"=>"Avdsgf3"}, {"New"=>"Dys_FSI_BB_AM_0003_Biopsy_60_LBG_fq.gz.res", "Old"=>"AnfdsfdsFS"}]
Итак, как мне преобразовать фактическое имя файла в папку в новую (в той же папке)?
отредактирован с помощью ответа
csv_lines = CSV.open('/Users/sebastianzeki/Desktop/tbb.csv',
headers: true,
col_sep: "\b")
filenames = Dir.glob("/Users/sebastianzeki/myfolder/*")
csv_lines.each do |row|
old_name = row['Old']
new_name = row['New']
filenames.each do |filename|
File.rename(old_name,new_name)
end
end
Вы посмотрели на [Как переименовать файл в Ruby] (http://stackoverflow.com/questions/5530479/how-to-rename-a-file-in-ruby)? Что вы подразумеваете под 'convert the actual filename'? –
Да, я это видел. Проблема в том, что я хочу попытаться преобразовать старое имя файла с новым именем файла на основе хеша, который я поставил в вопросе. Фактическое имя файла - это имя файла (в отличие от простого преобразования старого имени в хэш в новое имя в хеше). –
Какой смысл «редактировать с помощью ответа @ tuo» (что неверно, кстати, поскольку он неоднократно переименовывает «old_name' в' new_name' для каждой «строки»)? Редактирование должно состоять только в том, чтобы прояснить вопрос, а иногда и показать, что вы пробовали. –