Ruby, перебирая строки, подбирая точные шаблоны и заменяя каждый, кроме первого - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть столбец строк (городов) в CSV-файле. Мне нужно просмотреть список, пройтись по всем подходящим шаблонам, оставить только первый и заменить все похожие пустыми строками Я не программист, но если бы я мог это сделать, это бы мне очень помогло на работе! У меня есть понятия о Ruby и понятиях регулярных выражений в Emacs. Это возможно? Кто-нибудь может помочь?

Заранее спасибо!

Файл выглядит так :

Бордо

бордо

Париж

Париж

Париж

Riom

Файл должен выглядеть так:

бордо

(пустой)

Париж

(пустой)

(пустой)

Riom

Ответы [ 4 ]

2 голосов
/ 26 ноября 2010

Хранение пустых строк:

file_in = File.open('test_villes_ruby.txt','r')
file_out = File.open('test_villes_ruby_stripped.txt','w')

memo = ""
file_in.each do |city|
  if city == memo then
    file_out << "\n"
  else
    file_out << city
    memo = city
  end
end

file_in.close
file_out.close
1 голос
/ 27 ноября 2010

Для таких простых задач вы также можете передать свой скрипт ruby ​​непосредственно интерпретатору, используя параметр командной строки -e. Если вы объедините его с -n или -p, ваш скрипт ruby ​​будет выполняться по очереди на каждой строке ввода. Затем переменная $_ содержит содержимое строки, обрабатываемой в данный момент.

Итак, если ваш входной файл выглядит так:

jablan-mbp:dev $ cat test1.txt 
foo
foo
foo
bar
bar
foo
bar
bar
bar
bar
foo

Вы можете выполнить простой скрипт следующим образом:

jablan-mbp:dev $ ruby -n -e 'puts(@memo == $_ ? "" : @memo = $_)' < test1.txt 
foo


bar

foo
bar



foo
0 голосов
/ 27 ноября 2010

Вероятно, самый простой способ - это просто использовать набор (или SortedSet, если порядок имеет значение)

cities = Set.new

cities_in_csv.each do |city|
  cities.add(city)
end

Ничего лишнего. Наборы по определению не содержат повторяющихся элементов.

0 голосов
/ 27 ноября 2010

Решение:

File.open('cities', 'r') do |f_in|
  File.open('cities_uniq', 'w') do |f_out|
    f_in.inject("") { |o, c| f_out.puts o == c ? "\n" : c ; c}
  end
end

Введите:

Bordeaux
Bordeaux
Paris
Paris
Paris
Riom
Riom
Riom
Frankfurt
Wien
Wien

Выход:

Bordeaux

Paris


Riom


Frankfurt
Wien

Примечание: после финального "Wien" есть пустая строка, но я не могу отобразить ее здесь ...

...