2015-12-15 88 views
0

我有一个包含以下数据的文件Index.csv如何打印从另一个CSV采取指数的CSV文件行文件

100 
200 
300 
400 
500 
600 
700 
800 
900 
1000 

我需要打印或保存到一个新文件的New.csv行如Original.csv中所述的CSV文件Original.csv。我怎么做?

我不能这样做,所以我复制的Index.csv内容到一个数组中,并写了下面的代码,但它不工作:

array = [100,200,300,400,500,600,700,800,900,1000] 
CSV.open('New.csv', "wb") do |csv| 
    f = File.open('Original.csv', "r") 
     f.each_line { |line| 
      row = line.split(",") 
      for i in 0..array.size 
       if array[i]==line 
        csv<<row 
       end 
      end 
    } 
end 
+0

看看这个问题,以了解如何从文件中读取第n行 - http://stackoverflow.com/questions/4014352/ruby-getting-a-particular-line-from-a-file –

+0

什么是“ Original.csv中描述的CSV文件'Original.csv'的行是什么意思? –

+0

Index.csv和Original.csv有多大? Index.csv是否总是按升序排列? –

回答

1

我会告诉你一个方法来打印一行没有从"Index.csv"阅读。

array = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000] 
i = array.shift 
File.new("Original.csv").each_line.with_index(1) do 
    |l, j| 
    if j == i 
    puts l 
    i = array.shift 
    end 
end 
+0

我跑你的代码。它不会在屏幕上显示任何内容。 – Kristada673

+1

@ user5346597当我尝试它时工作得很好。你的文件是否有100行或更多行? –

2

您的问题中缺少详细信息,例如文件中有多少行,以及索引文件是否已排序。如果没有这些信息,并做最坏的假设,巨大的文件和未排序的索引文件,我会用这样的代码:

File.open('new.csv', 'w') do |new_csv| 
    File.foreach('index.csv') do |line_num| 
    File.open('original.csv', 'r') do |original_csv| 
     original_line = '' 
     line_num.to_i.times do 
     original_line = original_csv.gets 
     end 
     new_csv.puts original_line 
    end 
    end 
end 

假设的index.csv:

1 
3 
5 
7 
9 

和原始。 CSV的:

row1 
row2 
row3 
row4 
row5 
row6 
row7 
row8 
row9 
row10 

运行代码创建new.csv:

> cat new.csv 
row1 
row3 
row5 
row7 
row9 

CSV文件是文本,因此如果我们只关注单行,则不需要使用CSV类来读取或写入它们。

可以使用readlines进行更改,并将输入文件和索引混淆到结果数组中,但这会导致代码不可扩展。建议的代码将导致重新读取index.csv中每行的original.csv,但它也会处理任意大小的文件,这在生产环境中非常重要。

例如,如果index.csv会很小,未排序:

File.open('new.csv', 'w') do |new_csv| 
    indexes = File.readlines('index.csv').map(&:to_i).sort 
    File.foreach('original.csv').with_index(1) do |original_line, original_lineno| 
    new_csv.puts original_line if indexes.include?(original_lineno) 
    end 
end 

这将运行得更快,因为它只能通过original.csv一次迭代,但开辟了一个潜在的可扩展性问题,如果index.csv生长太大。

相关问题