как изменить текстовый файл в ruby - PullRequest
2 голосов
/ 20 июля 2010

У меня есть файл с именем ama.txt, и его содержимое выглядит следующим образом:

name      age   hobby       sex

amit      45    music       male

sumit     35    cricket     female

Теперь я могу открыть файл следующим образом:

File.open("ama.txt").each do

end

Как можноИзменить столбец hobby файла?

Ответы [ 2 ]

16 голосов
/ 20 июля 2010

Общая схема для чего-то подобного примерно такая:

  1. Открыть исходный файл для чтения и новый файл для записи. Читайте оригинал построчно.
  2. Пропускать любые несоответствующие строки (например, вы хотите пропустить строку заголовка и пробелы)
  3. Работайте с отдельными линиями так, как вам нужно. Здесь вы, вероятно, хотите что-то вроде cols = line.split(/\s+/), а затем хотите отредактировать cols[2], хотя я не знаю, соответствуют ли изменения шаблону или как.
  4. После внесения изменений выведите отредактированную строку в новый файл .
  5. Завершив чтение оригинала и запись измененных строк в новый файл, закройте оба файла.
  6. Измените имя оригинала на что-то вроде 'original_name' + '.bak', а имя нового файла на 'original_name'.
  7. Готово.

В 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
1 голос
/ 20 июля 2010
File.readlines("ama.txt").each do |line|
  row = line.strip.split('\t') # use your delimiter symbol
  row[2] = ... # hobby column
end

Или просто используйте fastcsv gem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...