Общая схема для чего-то подобного примерно такая:
- Открыть исходный файл для чтения и новый файл для записи. Читайте оригинал построчно.
- Пропускать любые несоответствующие строки (например, вы хотите пропустить строку заголовка и пробелы)
- Работайте с отдельными линиями так, как вам нужно. Здесь вы, вероятно, хотите что-то вроде
cols = line.split(/\s+/)
, а затем хотите отредактировать cols[2]
, хотя я не знаю, соответствуют ли изменения шаблону или как.
- После внесения изменений выведите отредактированную строку в новый файл .
- Завершив чтение оригинала и запись измененных строк в новый файл, закройте оба файла.
- Измените имя оригинала на что-то вроде 'original_name' + '.bak', а имя нового файла на 'original_name'.
- Готово.
В Ruby, как и в большинстве языков сценариев, есть много встроенных способов ускорить выполнение некоторых из этих шагов, но это основной шаблон. Дмитрий потенциально прав в том, что читатель CSV поможет вам в этом, но я не вижу, насколько хорошо отформатированы (или нет) ваши данные, поэтому я даже не буду вдаваться в подробности.
Наконец-то, и не грубо, но не похоже, что ты знаешь Руби особенно хорошо. Почему Ruby является обязательным требованием? Вы знаете другой язык сценариев? Насколько хорошо вы знаете Руби? В общем, люди здесь помогут вам с вещами, а не просто напишут код для вас.
Чтобы ответить на вопрос Амита о шаге 4: если у вас есть новый файл, открытый для записи, у вас будет дескриптор файла - переменная в вашей программе, указывающая на открытый файл. Вы можете записать в этот файл, используя дескриптор файла в качестве получателя для puts
. Поначалу это выглядит странно, поскольку puts
выглядит как обычная функция, но является вызовом метода в Ruby . Попробуйте это в irb
или коротком Ruby-скрипте:
fh = File.open('test.txt', 'w')
fh.puts "hello, world"
fh.close
Еще один короткий пример:
#!/usr/bin/env ruby
out_file = File.open('output.txt', 'w')
File.open('input.txt', 'r').each do |line|
out_file.print line.sub('foo', 'bar')
end
out_file.close
# no need to close the input file since the block version closes it for us
# automagically
# Maybe better to put the whole thing in a double block, though you may
# find this harder to follow at first
File.open('output.txt', 'w') do |out_file|
File.open('input.txt', 'r').each do |line|
out_file.print line.sub('foo', 'bar')
end
end