2010-09-07 35 views
2

我有一个字符串:如何使用Ruby删除部分CSV字符串?

"116,118,120,130" 

和将要在两者之间在执行删除要么第一,最后或任何价值。

为了这个我使用:

"116,118,120,130".gsub('118','') 

但问题是字符串包含一个额外unnessesary逗号:

"116,,120,130" 

,如果我用

"116,118,120,130".gsub(',116','') 

它会删除逗号,但不匹配字符串中的“116”,因为在“116”前没有逗号

如何匹配我的字符串的部分可能或我没有逗号前面的值我正在优雅地删除?

感谢,

回答

4

嗯,我可能会尝试像...

"116,118,120,130".split(',').reject{|e|e=="116"}.join(',') 
+0

+1这可能是最简单的方法来做到这一点。将字符串拆分成一个数组(以逗号分隔),然后删除任何你不想要的,然后将数组重新组装成一个逗号分隔的字符串。尽管'gsub'或类似的方法可能会做到这一点,但这种方法似乎不太容易出错。 – bta 2010-09-07 23:46:59

0

那么,有两种简单的方法来做到这一点。首先,您可以使用正则表达式。一个简单的如:

"116,118,120,130".gsub(/(,118)|(118,)/,'') 

会做你想做的。随着118您所寻找的任何价值取代。但是,如果你正在寻找更多的1值,为什么不拆分并重新组合。例如

"116,118,120,130".split(',').reject {|val| val == '118' || val == '130'}.join(',') 

返回“116,120”

0

如果是稍微复杂一点的CSV数据(例如,它已经嵌入的逗号),使用csv标准库模块

require 'csv' 
str = 'abc,def,"ghi,jlk",mno' 
fields = CSV.parse_line(str) 
fields.reverse! # or do whatever manipulation 
new_line = CSV.generate_line(fields) 
# => "mno,\"ghi,jlk\",def,abc\n"