簡體   English   中英

刪除文件中的行 - Ruby

[英]remove rows in file - Ruby

在特定行中存在特定值的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

理想情況下,我想要一個只用這個創建的新文件:

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

給這個時:

300-2580
300-3080
300-2080

所以我知道我可以用sort filename|uniq -d做到這一點,但我正在努力學習Ruby(有點痛苦)。

先謝謝,M

您可以使用它來獲取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"]

要將其寫入新文件,您可以在寫入模式下打開文件,將其寫入文件:

File.open("new_csv", "w+") { |file| file.puts File.readlines("csv").uniq }

為了比較值,您可以使用“,”上的拆分功能來訪問每列,如下所示:

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"

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

您還可以創建一個不允許重復記錄作為其條目的哈希。 例如,以下代碼應該有所幫助:

require 'optparse'
require 'csv'
require 'pp'

options = Hash.new

OptionParser.new do |opts|
    opts.banner = "Usage: remove_extras.rb [options] file1 ..."

    options[:input_file] = ''
    opts.on('-i', '--input_file FILENAME', 'File to have extra rows removed') do |file|
        options[:input_file] = file
    end

end.parse!
if File.exists?(options[:input_file])
    p "Parsing: #{options[:input_file]}"
        UniqFile=Hash.new    
        File.open(options[:input_file]).each do |row|
        UniqFile.store(row,row.hash)                
end
puts "please enter the output filename: \n"
aFile=File.open(gets.chomp, "a+")
UniqFile.each do|key,value| 
aFile.syswrite("#{key}")
end  

end

好吧,我不認為這個例子會得到你想要的答案......但是這樣可行......

tmp.txt =>

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

File.readlines('tmp.txt').uniq將返回:

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

因此,您也可以使用Array fxns輕松排序。 谷歌ruby數組,我相信你可以學習如何根據與所需字符串的比較來選擇條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM