如何按以下字段拆分(这是 sql 格式)?以前我只用','分割,如果该字符序列在引号内,它会失败。不幸的是,我也不能用引号分割,因为数字没有。
mystring = "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
mystring.split(', ')
我需要得到
'1'
'data'
'data_two, '
'Test 34'
''
'gb'
'1'
'1'
CSV
如果你去掉括号,你可以使用with 选项强制它成为可解析的。
CSV.parse_line(mystring[1..-2], {:col_sep=>", ", :quote_char=>"'"})
=> ["1", "data, ", "data_two, ", "Test 34", "", "gb", "1", "1"]
这可能会有所帮助:
irb(main):001:0> mystring
=> "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
irb(main):002:0> mystring.scan(/(?:'(?:\\.|[^'])*'|[^,' ])+/)
=> ["(1", "'data, '", "'data_two, '", "'Test 34'", "''", "'gb'", "1", "'1')"]
或者,如果您需要删除引号和大括号,则:
irb(main):003:0> mystring.scan(/([^', ()]+)|'([^']*)'/).flatten.compact
=> ["1", "data, ", "data_two, ", "Test 34", "", "gb", "1", "1"]
这将匹配任何非引号/大括号/逗号/空格字符,或单个“引号”内的任何内容。(请注意,\x
与第一个示例不同,第二个示例中没有考虑转义序列()。但可能是您不需要这样的复杂性。)
mystring.split(/,/).map{|x| x.gsub(/[()\']/,'').strip}
=> ["1", "data", "", "data_two", "", "Test 34", "", "gb", "1", "1"]