當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。