2010-09-07 2 views
2

У меня есть строка:Как удалить часть строки CSV с помощью Ruby?

"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 csv стандартной библиотеки Это, вероятно, самый простой способ сделать это. Разделите строку в массив (разбивая запятые), затем удалите все, что вам не нужно, затем снова соберите массив в строку с разделителями-запятыми. Хотя, вероятно, можно сделать то же самое с 'gsub' или аналогичным образом, этот метод кажется гораздо менее подверженным ошибкам. – bta

0

Ну, есть два простых способа сделать это. Во-первых, вы можете использовать регулярное выражение. Простой пример:

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

Будет делать то, что вы хотите. С заменой 118 на любое значение, которое вы ищете. Но если вы ищете более одного значения, почему бы просто не разделить и не перекомпилировать его. Например

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

Возвращает «116120»

0

Если это немного более сложные данные в формате 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" 
Смежные вопросы