我希望按comma
分割以下数据,但双引号字符串中的comma
除外
"(CONTRACTS OF 5,000 BUSHELS)"
怎么做?
raw_str.split
无法正常工作
raw_str = '"WHEAT-SRW " ,150106 ,
CBT ,00 ,001 ,
31.5, 26.4, "(CONTRACTS OF 5,000 BUSHELS)"'
其实我想从" http://www.cftc.gov/dea/newcot/f_disagg.txt"
解析文件 html = Curl.get("http://www.cftc.gov/dea/newcot/f_disagg.txt")
html.body_str.split ~~~~
答案 0 :(得分:5)
为什么要重新开车? 您的文字是CSV,因此请使用CSV gem这样
require 'csv'
CSV.foreach("f_disagg.txt", {:headers=>false, :col_sep => ",", force_quotes: false, :quote_char => "\x00"}) do |row|
p row
end
["\"WHEAT-SRW - CHICAGO BOARD OF TRADE\" ", "150106 ", "2015-01-06", "001602 ", "CBT ", "00 ", "001 ", " 375872", " 32141", " 138392", " 111530", " 5662", " 14877", " 92842", " 75279", " 34611", " 34276", " 44861", " 22692", " 342969", " 336374", " 32903", " 39498", " 260179", " 19786", " 85222", " 93057", " 6641", " 1023", " 67360", " 78720", " 16703", " 36845", " 42816", " 4110", " 238884", " 235235", " 21295", " 24944", " 115693", " 12355", " 53170", " 21065", " 1613", " 11262", " 34424", " 5501", " 8966", " 5915", " 10529", " 10098", " 104085", " 101139", " 11608", " 14554", " 3895", " -1034", " -7666", " -763", " 225", " 312", " -4547", " 2110", " 6077", " -334", " -435", " 1750", " 1461", " 2373", " 2434", " 1522", " 100.0", " 8.6", " 36.8", " 29.7", " 1.5", " 4.0", " 24.7", " 20.0", " 9.2", " 9.1", " 11.9", " 6.0", " 91.2", " 89.5", " 8.8", " 10.5", " 100.0", " 7.6", " 32.8", " 35.8", " 2.6", " 0.4", " 25.9", " 30.3", " 6.4", " 14.2", " 16.5", " 1.6", " 91.8", " 90.4", " 8.2", " 9.6", " 100.0", " 10.7", " 46.0", " 18.2", " 1.4", " 9.7", " 29.8", " 4.8", " 7.7", " 5.1", " 9.1", " 8.7", " 90.0", " 87.4", " 10.0", " 12.6", " 353", " 63", " 84", " 21", " 5", " 16", " 69", " 35", " 43", " 45", " 66", " 67", " 269", " 261", " 340", " 45", " 79", " 21", " 5", " .", " 66", " 33", " 31", " 54", " 63", " 38", " 215", " 225", " 222", " 37", " 68", " 17", " 6", " 14", " 33", " 13", " 12", " 23", " 46", " 29", " 144", " 161", " 16.2", " 12.2", " 26.0", " 21.6", " 14.6", " 10.9", " 24.0", " 18.5", " 18.4", " 14.9", " 30.4", " 25.7", " 18.2", " 14.9", " 29.9", " 25.6", " 23.6", " 19.4", " 37.6", " 32.5", " 21.7", " 17.7", " 31.5", " 26.4", "\"(CONTRACTS OF 5", "000 BUSHELS)\" ", "\"001602\" ", "\"CBT\" ", "\"001\" ", "\"A10\" ", "\"FutOnly\""], etc
编辑:这里有一个处理括号之间逗号的版本,如果a)被找到,那么该字段与珍贵的字段和它自己删除的字段相结合
CSV.foreach("f_disagg.txt", {:headers=>false, :col_sep => ",", force_quotes: false, :quote_char => "\x00"}) do |row|
row.each_with_index do |val, index|
if val[')']
row[index-1] = "#{row[index-1]},#{val}"
row.delete_at(index)
val = ''
end
val
end
p row
end
答案 1 :(得分:1)
您可以使用regex和“负向前瞻”和“负面后瞻”[0]来完成此操作:
raw_str = '"WHEAT-SRW " ,150106 ,
CBT ,00 ,001 ,
31.5, 26.4, "(CONTRACTS OF 5,000 BUSHELS)"'
raw_str.split(/(,)(?<!")(!?=")/)
["\"WHEAT-SRW \" ,150106 ,2015-01-06,001602 \n ,CBT ,00 ,001 , 375872, 32141,
14.9, \n37.6, 32.5, 21.7, 17.7, \n31.5, 26.4,
\"(CONTRACTS OF 5,000 BUSHELS)\""]
你说的是:“把逗号放在capture group中,只要它前面没有双引号,并且后面没有双引号。”
[0] http://ruby-doc.org/core-2.2.0/Regexp.html#class-Regexp-label-Anchors