【问题标题】:Ruby, iterating through strings, matching exact patterns and replacing each but the first oneRuby,遍历字符串,匹配精确模式并替换除第一个之外的每个模式
【发布时间】:2011-05-16 07:33:08
【问题描述】:

我在 csv 文件中有一列字符串(城市)。我需要遍历列表,遍历所有匹配的模式,只保留第一个并用空行替换所有相似的模式。 我不是程序员,但如果我能做到这一点,那将对我的工作有很大帮助! 我有 Ruby 的概念和 Emacs 中的正则表达式的概念。 这可行吗?有人可以帮忙吗?

提前谢谢你!

文件如下所示

波尔多

波尔多

巴黎

巴黎

巴黎

里奥姆

文件应如下所示:

波尔多

(空白)

巴黎

(空白)

(空白)

里奥姆

【问题讨论】:

  • 这些名字会一直组合在一起,还是会有其他的混在一起?
  • 另外,您说您需要对 CSV 文件中的多个列执行此操作?如果您正在处理多个列,您能否展示一个更完整的输入示例?

标签: ruby regex iteration pattern-matching


【解决方案1】:

保留空行:

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,500 行,不同文件中的大约 10 列)。不会再觉得自己像个孤独的奴隶了!
  • 已编辑(实际上完全重写)。
  • 我无法告诉你我对此有多高兴!它工作得很好!你不知道(哦,好吧,你知道)我会用这个节省多少时间!真的,我感激不尽!
  • 抱歉,如果您有几秒钟的时间来解释“城市”和“备忘录”是如何被解释为...什么的?专栏的负责人,当我阅读 Ruby 文献(几周后不会成为程序员)时,这对我很有帮助......
【解决方案2】:

对于这样简单的任务,您还可以使用-e 命令行参数将您的ruby 脚本直接传递给解释器。如果将它与-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

【讨论】:

    【解决方案3】:

    解决方案:

    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”后面有一个空行,但我无法在此处显示...

    【讨论】:

      【解决方案4】:

      可能最简单的方法就是使用一个集合(如果顺序很重要,也可以使用 SortedSet)

      cities = Set.new
      
      cities_in_csv.each do |city|
        cities.add(city)
      end
      

      没有多余的。根据定义,集合不包含重复元素。

      【讨论】:

      • OP 要求用换行符替换重复的元素。
      • 谢谢。我错过了那部分。这是我在深夜回答问题时得到的。
      猜你喜欢
      • 2018-07-15
      • 2018-07-03
      • 2012-09-26
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多