удалить строки в файле - Ruby - PullRequest
       10

удалить строки в файле - Ruby

4 голосов
/ 23 августа 2011

Каков умный способ удалить строки из CSV-файла в ruby, где определенное значение существует в определенной строке?

Вот пример файла:

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, но я пытаюсь выучить Руби (довольно болезненно).

Заранее спасибо, M

Ответы [ 3 ]

12 голосов
/ 23 августа 2011

Вы можете использовать это для получения уникальных строк в массиве в 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 }

Для сравнения значений вы можете использовать функцию split для ",", чтобы получить доступ к каждому столбцу следующим образом:

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 .

0 голосов
/ 30 декабря 2014

Вы также можете создать Хеш, который НЕ позволит дублировать записи в качестве записей. Например, следующий код должен помочь:

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
0 голосов
/ 23 августа 2011

Ну, я не думаю, что этот пример получит ответ, который вы ищете ... но это сработает ...

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.Google ruby ​​массивы, и я уверен, что вы можете узнать, как выбрать, хотите ли вы запись в соответствии со сравнением с желаемой строкой.

...