Ruby 如何打印另一个CSV文件索引的CSV文件中的行

Ruby 如何打印另一个CSV文件索引的CSV文件中的行,ruby,csv,Ruby,Csv,我有一个包含以下数据的文件Index.csv: 100 200 300 400 500 600 700 800 900 1000 我需要打印或保存到新文件new.csv中csv文件的行Original.csv,如Original.csv中所述。我该怎么做 我做不到,所以我将Index.csv的内容复制到一个数组中,并编写了以下代码,但它不起作用: array = [100,200,300,400,500,600,700,800,900,1000] CSV.open('New.csv', "wb

我有一个包含以下数据的文件
Index.csv

100
200
300
400
500
600
700
800
900
1000
我需要打印或保存到新文件
new.csv
中csv文件的行
Original.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
array=[1002003004005006007008009001000]
CSV.open('New.CSV',“wb”)do | CSV|
f=文件.open('Original.csv',“r”)
f、 每条{线|
行=行。拆分(“,”)
对于0..array.size中的i
如果数组[i]==行

csv我将向您展示一种无需阅读
“Index.csv”
即可打印一行的方法


我将向您展示一种无需从
“Index.csv”
读取而打印一行的方法


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

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
运行代码将创建新的.csv:

> cat new.csv
row1
row3
row5
row7
row9
CSV文件是文本,因此,如果我们只关注单个行,则不必使用CSV类来读取或写入它们

可以对使用
readlines
进行更改,并将输入文件和索引拖到生成的数组中,但这将导致代码无法扩展。建议的代码将导致重新读取index.csv中每一行的original.csv,但它也将处理任意大小的文件,这一点非常重要生产环境中的nt

例如,如果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变得太大,则会带来潜在的可伸缩性问题。

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

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
运行代码将创建新的.csv:

> cat new.csv
row1
row3
row5
row7
row9
CSV文件是文本,因此,如果我们只关注单个行,则不必使用CSV类来读取或写入它们

可以对使用
readlines
进行更改,并将输入文件和索引拖到生成的数组中,但这将导致代码无法扩展。建议的代码将导致重新读取index.csv中每一行的original.csv,但它也将处理任意大小的文件,这一点非常重要生产环境中的nt

例如,如果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太大,则会带来潜在的可伸缩性问题。

看看这个问题,了解如何从文件中读取第n行-什么是“csv文件的行
original.csv
”,如
original.csv
中所述意思是?Index.csv和Original.csv可以有多大?Index.csv是否总是按升序排列?看看这个问题,了解如何从文件中读取第n行-什么是“csv文件的行
Original.csv
”(如
Original.csv
中所述)意思是?Index.csv和Original.csv可以有多大?Index.csv是否总是按升序排列?我运行了你的代码。它没有在屏幕上显示任何内容。@user5346597在我尝试时工作正常。你的文件有100行或更多行吗?我运行了你的代码。它没有在屏幕上显示任何内容。@user5346597在我尝试时工作正常。@user5346597在我尝试时工作正常t、 您的文件是否有100行或更多行?