簡體   English   中英

Ruby CSV - 檢索每行解析的原始原始行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM