簡體   English   中英

解析ruby中的CSV字符串

[英]Parsing CSV string in ruby

我有以下字符串 - 它不是以逗號分隔,但與csv數據集具有相同的效果:

response = "Date;Amount;Account;User\n2014-12-01;12.01;abcxyz;user1\n2014-12-01;10.09;fine;user2\n\r\n\t\t\r\n"

我嘗試運行以下內容來解析它:

CSV.parse(response, :col_sep => ";", :row_sep => :auto) 

但是我收到以下錯誤:

CSV :: MalformedCSVError:未加引號的字段不允許\\ r或\\ n

知道為什么會這樣嗎?

我也試過做一個response.gsub!("\\t", "")看看是不是問題,但似乎沒有幫助。

我使用#strip工作了:

require 'csv'

response = "Date;Amount;Account;User\n2014-12-01;12.01;abcxyz;user1\n2014-12-01;10.09;fine;user2\n\r\n\t\t\r\n"

CSV.parse(response.strip, :col_sep => ';') do |row|
  p row
end

輸出:

arup$ ruby a.rb
["Date", "Amount", "Account", "User"]
["2014-12-01", "12.01", "abcxyz", "user1"]
["2014-12-01", "10.09", "fine", "user2"]

這將為您提供數組中的每一行。

CSV.parse( response.gsub( /[\r\t]/, '' ), col_sep: ";" )
=> [["Date", "Amount", "Account", "User"], ["2014-12-01", "12.01", "abcxyz", "user1"], ["2014-12-01", "10.09", "fine", "user2"], [], []]

除非您想將所有行合並為一行,否則您需要保留\\n以使解析器解釋為新行。

解決此問題的一種簡單方法是在解析字符串之前用單個換行符替換任何連續的空白字符。 然后,您可以使用換行符作為行分隔符,而不是將其設置為:auto 這應該使CSV解析更快(因為它需要更多的時間來:auto猜測你的分隔符),盡管從技術上來說,性能也受到對gsub的額外調用的負面影響。

CSV.parse(response.gsub(/\s+/, "\n"), col_sep: ';', row_sep: "\n")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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