[英]Ruby CSV - Retrieve original, raw line with each row parsed?
TL;DR:如何在解析 csv 文件時獲取原始輸入行(不是行號)?
我正在使用 Ruby 的 CSV class 解析一個分隔文件。 除了從該行解析的字段外,我還想從文件中檢索每一行的原始行。
這是我現在擁有的:
CSV.foreach(input_file, csv_params) do |row|
add_uploaded_user(row)
end
這完美地工作。 每個文件都被正確解析,並且 add_uploaded_user 做了它應該做的事情。
我們從一個客戶那里得到一些不尋常的文件,數據中包含意外的用戶名。 該文件是有效的 csv 並正確解析。 他們聲稱我們正在弄亂他們的記錄,因此我們希望在解析文件之前從文件中捕獲每個原始行。 我們已經保存了整個 CSV 文件,但是收到投訴時手動拉文件並查找源記錄不方便。 我們想給他們一個工具,這樣他們就可以准確地驗證他們發送給我們的內容。 此外,我們無法從該文件中透露相關用戶的其他記錄,因此我們無法共享整個文件。
所以,我們想用我們從他們的文件創建的每個解析記錄來捕獲原始輸入行。 像這樣的東西:
CSV.foreach(input_file, csv_params) do |row|
add_uploaded_user(row, row.raw_line)
end
...其中raw_line
是來自 CSV 的一些方法/屬性/幫助程序,它揭示了剛剛解析的行。
我瀏覽了 CSV 文檔,發現https://ruby-doc.org/stdlib-2.6.1/libdoc/csv/rdoc/CSV.html#method-i-line :
line()
- 從此文件中讀取的最后一行。 但我不知道如何調用line()
。 我嘗試了幾次調用,結果幾乎都一樣,使用NoMethodError: undefined method 'line' for CSV:Class
:
irb(main):022:0> CSV.line
NoMethodError: undefined method 'line' for CSV:Class
irb(main):049:0* csv = CSV.new("a,b,c\n1,2,3\n")
=> <#CSV io_type:StringIO encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
irb(main):050:0> csv.each do |row|
irb(main):051:1* puts row
irb(main):052:1> puts csv.line
irb(main):053:1> end
a
b
c
NoMethodError: undefined method 'line' for #<CSV:0x00007feeb25de3c0>
from (irb):52:in 'block in irb_binding'
from (irb):50
irb(main):054:0>
還有一個更簡單的例子,讀取一個實際的文件:
irb(main):055:0> csv = CSV.new(File.open('3_licenses.csv'))
=> <#CSV io_type:File io_path:"3_licenses.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\r\n" quote_char:"\"">
irb(main):062:0> csv.shift
=> ["first_name", "last_name", "license_number"]
irb(main):063:0> csv.shift
=> ["David ", "Hempy", "1001"]
irb(main):064:0> csv.line
NoMethodError: undefined method 'line' for #<CSV:0x00007feeb2591020>
from (irb):64
irb(main):065:0> csv.shift
=> ["Santa", "Claus", "np.1"]
更新:
我正在閱讀的文檔是針對 2.6 的。 我正在運行 ruby 2.4.5,但它看起來也在那里: https://ruby-doc.com/stdlib-2.4.5/libdoc/csv/rdoc/CSV.html#method-i線。 有趣的是, https://docs.ruby-lang.org/en/2.4.0/CSV.html中沒有提到.line
嗯......
另外,我不需要行號——我需要輸入文件中的原始行。
此時,我已經准備好自己閱讀這些行,然后為每一行分別調用 CSV。 這肯定會起作用並讓我控制......但我仍然很困惑為什么我不能調用文檔中描述的.line()
方法。 如果有人能明白為什么我會得到“未定義的方法'line'”,我一定會很感激的。
當文檔提到CSV#line
時,它們意味着您必須在 CSV 的實例上調用它:
require 'csv'
csv = CSV.new(File.open('example.csv'))
csv.each do |row|
p csv.line
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.