Ruby,迭代字符串,匹配精确的模式并替换除第一个之外的每个模式

发布于 2024-10-04 10:12:29 字数 374 浏览 8 评论 0原文

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

先感谢您!

文件如下所示

波尔多

波尔多

巴黎

巴黎

巴黎

Riom

文件应如下所示:

波尔多

(空白)

巴黎

(空白)

(空白)

Riom

I have a column of strings (cities) in a csv file. I'd need to go through the list, iterate through all matching patterns, keep only the first one and replace all similar ones with blank lines.
I am no programmer, but if I could do this that would help me a lot at work!
I have notions of Ruby and notions of regexp in Emacs.
Is this feasible? Can anyone help?

Thank you in advance!

File looks like this:

Bordeaux

Bordeaux

Paris

Paris

Paris

Riom

File should look like this:

Bordeaux

(blank)

Paris

(blank)

(blank)

Riom

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我还不会笑 2024-10-11 10:12:29

保留空行:

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

Keeping the empty lines:

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
千紇 2024-10-11 10:12:29

对于此类简单的任务,您还可以使用 -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

For such simple tasks, you can also pass your ruby script directly to the interpreter using -e command line parameter. If you combine it with -n or -p, your ruby script will be performed on every line of the input, in turns. Variable $_ then holds the content of the line currently being processed.

So, if your input file looks like this:

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

You can execute a simple script this way:

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


bar

foo
bar



foo
忆沫 2024-10-11 10:12:29

解决方案:

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

Solution:

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

Input:

Bordeaux
Bordeaux
Paris
Paris
Paris
Riom
Riom
Riom
Frankfurt
Wien
Wien

Output:

Bordeaux

Paris


Riom


Frankfurt
Wien

Note: There's an empty line after the final "Wien", but I can't get it to display here...

向地狱狂奔 2024-10-11 10:12:29

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

cities = Set.new

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

没有任何额外的东西。根据定义,集合不包含重复元素。

Probably the simpliest way is just to use a set (or SortedSet if order matters)

cities = Set.new

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

Nothing extra. Sets by definition do not contain duplicate elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文