当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby CSV.foreach用法及代码示例


本文简要介绍ruby语言中 CSV.foreach 的用法。

用法

foreach(path, mode='r', **options) {|row| ... )
foreach(io, mode='r', **options {|row| ... )
foreach(path, mode='r', headers: ..., **options) {|row| ... )
foreach(io, mode='r', headers: ..., **options {|row| ... )
foreach(path, mode='r', **options) → new_enumerator
foreach(io, mode='r', **options → new_enumerator

调用从源 pathio 读取的每一行的块。

  • 参数 path 如果给定,则必须是文件的路径。

  • 参数 io 应该是一个 IO 对象,即:

    • 开放阅读;返回时, IO 对象将被关闭。

    • 定位在开头。要定位在末尾,要追加,请使用方法 CSV.generate 。对于任何其他定位,请改为传递预设的 StringIO 对象。

  • 参数 mode ,如果给定,必须是文件模式参见 Open Mode

  • 参数 **options 必须是关键字选项。请参阅解析选项。

  • 此方法可选择接受一个额外的 :encoding 选项,您可以使用该选项指定从 pathio 读取的数据的 Encoding 。除非您的数据采用 Encoding::default_external 给出的编码,否则您必须提供此信息。解析将使用它来确定如何解析数据。您可以提供第二个 Encoding ,以便在读取数据时对其进行转码。例如,

    encoding: 'UTF-32BE:UTF-8'

    将从文件中读取UTF-32BE数据,但在解析之前将其转码为UTF-8

没有选项headers

如果没有选项 headers ,则将每一行作为 Array 对象返回。

这些示例假定事先执行:

string = "foo,0\nbar,1\nbaz,2\n"
path = 't.csv'
File.write(path, string)

path 的文件中读取行:

CSV.foreach(path) {|row| p row }

输出:

["foo", "0"]
["bar", "1"]
["baz", "2"]

从 IO 对象中读取行:

File.open(path) do |file|
  CSV.foreach(file) {|row| p row }
end

输出:

["foo", "0"]
["bar", "1"]
["baz", "2"]

如果没有给出块,则返回一个新的枚举器:

CSV.foreach(path) # => #<Enumerator: CSV:foreach("t.csv", "r")>
CSV.foreach(File.open(path)) # => #<Enumerator: CSV:foreach(#<File:t.csv>, "r")>

如果不支持编码,则发出警告:

CSV.foreach(File.open(path), encoding: 'foo:bar') {|row| }

输出:

warning: Unsupported encoding foo ignored
warning: Unsupported encoding bar ignored
使用选项headers

使用 {option headers },将每行作为 CSV::Row 对象返回。

这些示例假定事先执行:

string = "Name,Count\nfoo,0\nbar,1\nbaz,2\n"
path = 't.csv'
File.write(path, string)

path 的文件中读取行:

CSV.foreach(path, headers: true) {|row| p row }

输出:

#<CSV::Row "Name":"foo" "Count":"0">
#<CSV::Row "Name":"bar" "Count":"1">
#<CSV::Row "Name":"baz" "Count":"2">

从 IO 对象中读取行:

File.open(path) do |file|
  CSV.foreach(file, headers: true) {|row| p row }
end

输出:

#<CSV::Row "Name":"foo" "Count":"0">
#<CSV::Row "Name":"bar" "Count":"1">
#<CSV::Row "Name":"baz" "Count":"2">

如果 path 是字符串,但不是可读文件的路径,则引发异常:

# Raises Errno::ENOENT (No such file or directory @ rb_sysopen - nosuch.csv):
CSV.foreach('nosuch.csv') {|row| }

如果 io 是 IO 对象,但未打开以供读取,则引发异常:

io = File.open(path, 'w') {|row| }
# Raises TypeError (no implicit conversion of nil into String):
CSV.foreach(io) {|row| }

如果 mode 无效,则引发异常:

# Raises ArgumentError (invalid access mode nosuch):
CSV.foreach(path, 'nosuch') {|row| }

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 CSV.foreach。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。