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行或更多行?