1

如何按以下字段拆分(这是 sql 格式)?以前我只用','分割,如果该字符序列在引号内,它会失败。不幸的是,我也不能用引号分割,因为数字没有。

mystring = "(1, 'data, ', 'data_two, ', 'Test 34', '', 'gb', 1, '1')"
mystring.split(', ')

我需要得到

'1'
'data'
'data_two, '
'Test 34'
''
'gb'
'1'
'1'
4

3 回答 3

1

CSV如果你去掉括号,你可以使用with 选项强制它成为可解析的。

CSV.parse_line(mystring[1..-2], {:col_sep=>", ", :quote_char=>"'"})

 => ["1", "data, ", "data_two, ", "Test 34", "", "gb", "1", "1"]
于 2012-11-09T23:10:27.393 回答
0

这可能会有所帮助:

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与第一个示例不同,第二个示例中没有考虑转义序列()。但可能是您不需要这样的复杂性。)

于 2012-11-10T02:25:27.837 回答
0
mystring.split(/,/).map{|x| x.gsub(/[()\']/,'').strip}
 => ["1", "data", "", "data_two", "", "Test 34", "", "gb", "1", "1"] 
于 2012-11-09T21:29:08.800 回答