删除文件中的行 - Ruby

Mar*_*rkL 4 ruby duplicate-removal

在特定行中存在特定值的ruby中从CSV文件中删除行的巧妙方法是什么?

这是一个文件的例子:

350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要一个只用这个创建的新文件:

350 lbs., Outrigger Footprint, 61" x 53", Weight, 767 lbs., 300-2080
350 lbs., Outrigger Footprint, 61" x 53", Weight, 817 lbs., 300-2580
350 lbs., Outrigger Footprint, 69" x 61", Weight, 867 lbs., 300-3080
Run Code Online (Sandbox Code Playgroud)

给这个时:

300-2580
300-3080
300-2080
Run Code Online (Sandbox Code Playgroud)

所以我知道我可以做到这一点,sort filename|uniq -d但我正在努力学习Ruby(有点痛苦).

先谢谢,M

rub*_*nce 12

您可以使用它来获取csv文件中数组中的唯一行

File.readlines("file.csv").uniq
=> ["350 lbs., Outrigger Footprint, 61\" x 53\", Weight, 767 lbs., 300-2080\n", "350 lbs., Outrigger Footprint, 61\" x 53\", Weight, 817 lbs., 300-2580\n", "350 lbs., Outrigger Footprint, 69\" x 61\", Weight, 867 lbs., 300-3080\n"]
Run Code Online (Sandbox Code Playgroud)

要将其写入新文件,您可以在写入模式下打开文件,将其写入文件:

File.open("new_csv", "w+") { |file| file.puts File.readlines("csv").uniq }
Run Code Online (Sandbox Code Playgroud)

为了比较值,您可以使用","上的拆分功能来访问每列,如下所示:

rows = File.readlines("csv").map(&:chomp) # equivalent to File.readlines.map { |f| f.chomp }
mapped_columns = rows.map { |r| r.split(",").map(&:strip) }
=> [["350 lbs.", " Outrigger Footprint", " 61\" x 53\"", " Weight", " 767 lbs.", " 300-2080"], ["350 lbs.", " Outrigger Footprint", " 61\" x 53\"", " Weight", " 817 lbs.", " 300-2580"], .....]
mapped_columns[0][5]
=> "300-2080"
Run Code Online (Sandbox Code Playgroud)

如果您想要更多功能,最好安装FasterCSV gem.

  • 你只需要FasterCSV,如果你坚持1.8,1.9的CSV是FasterCSV(有一些改进). (2认同)