gpt4 book ai didi

Ruby CSV - 获取当前行/行号

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:20 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何从 Ruby CSV 中获取当前行/行号。这是我的代码:

options = {:encoding => 'UTF-8', :skip_blanks => true}
CSV.foreach("data.csv", options, ) do |row, i|
puts i
end

但这似乎并没有按预期工作。有办法做到这一点吗?

最佳答案

由于当前 Rubies 中 CSV 的更改,我们需要进行一些更改。在 2.6 之前使用 Ruby 的原始解决方案的答案中进一步查看。以及 with_index 的使用,无论版本如何,它都可以继续工作。

对于 2.6+ 这将有效:

require 'csv'

puts RUBY_VERSION

csv_file = CSV.open('test.csv')
csv_file.each do |csv_row|
puts '%i %s' % [csv_file.lineno, csv_row]
end
csv_file.close

如果我阅读:

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!\nair, moon roof, loaded",4799.00

此输出的代码结果:

2.6.3
1 ["Year", "Make", "Model", "Description", "Price"]
2 ["1997", "Ford", "E350", "ac, abs, moon", "3000.00"]
3 ["1999", "Chevy", "Venture \"Extended Edition\"", "", "4900.00"]
4 ["1999", "Chevy", "Venture \"Extended Edition, Very Large\"", "", "5000.00"]
5 ["1996", "Jeep", "Grand Cherokee", "MUST SELL!\\nair, moon roof, loaded", "4799.00"]

更改是因为我们必须访问当前文件句柄。以前我们可以使用全局 $.,它总是有失败的可能性,因为全局变量可能会被调用代码的其他部分踩踏。如果我们有正在打开的文件的句柄,那么我们可以使用 lineno 而不必担心。


$.

Ruby 2.6 之前的版本会让我们这样做:

Ruby 有一个 magic variable $.这是当前正在读取的文件的行号:

require 'csv'

CSV.foreach('test.csv') do |csv|
puts $.
end

使用上面的代码,我得到:

1
2
3
4
5

$INPUT_LINE_NUMBER

$. 在 Perl 中一直被使用。在 Ruby 中,建议我们按以下方式使用它,以避免它的“神奇”一面:

require 'english'

puts $INPUT_LINE_NUMBER

如果需要处理字段中嵌入的行结束符,只需稍作修改即可轻松处理。假设一个 CSV 文件“test.csv”包含一行带有嵌入式换行符:

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00
1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00

with_index

使用枚举器的 with_index(1)可以很容易地跟踪 CSV 产生 block 的次数,使用 $. 进行有效模拟,但在阅读处理行尾所需的额外行时尊重 CSV 的工作:

require 'csv'

CSV.foreach('test.csv', headers: true).with_index(1) do |row, ln|
puts '%-3d %-5s %-26s %s' % [ln, *row.values_at('Make', 'Model', 'Description')]
end

运行时输出:

$ ruby test.rb
1 Ford E350 ac, abs, moon
2 Chevy Venture "Extended Edition"
3 Jeep Grand Cherokee MUST SELL!
air, moon roof, loaded
4 Chevy Venture "Extended Edition, Very Large"

关于Ruby CSV - 获取当前行/行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com