如何用逗号分隔字符串,双引号字符串中的逗号除外

时间:2015-01-12 09:42:12

标签: ruby

我希望按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 ~~~~

2 个答案:

答案 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