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