2010-09-07 6 views
2

J'ai une chaîne:Comment supprimer une partie d'une chaîne CSV en utilisant Ruby?

"116,118,120,130" 

et veulent supprimer soit la première, dernière ou toute valeur entre lors de l'exécution.

Pour ce que j'utilisais:

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

mais le problème est la chaîne contient une virgule unnessesary supplémentaire:

"116,,120,130" 

et si j'utilise

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

il sera supprimer la virgule, mais ne correspondra pas "116" dans la chaîne car il n'y a pas de virgule devant "116"

Comment puis-je faire correspondre des parties de ma chaîne qui peuvent ou ne pas avoir la virgule devant la valeur que je supprime élégamment?

Merci,

Répondre

4

Hmm, je pourrais essayer quelque chose comme ...

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

+1 Ceci est probablement le moyen le plus facile de le faire. Divisez la chaîne en un tableau (en séparant les virgules), puis supprimez tout ce que vous ne voulez pas, puis réassemblez le tableau en une chaîne délimitée par des virgules. Bien qu'il soit probablement possible de faire la même chose avec 'gsub' ou similaire, cette méthode semble beaucoup moins sujette aux erreurs. – bta

0

Eh bien, il y a deux façons simples de le faire. D'abord, vous pouvez utiliser une expression régulière. Un simple comme:

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

Fera ce que vous voulez. Avec 118 remplacé par n'importe quelle valeur que vous recherchez. Mais si vous cherchez plus de 1 valeur, pourquoi ne pas le diviser et le recombiner. Par exemple

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

retours "116120"

0

Si ses données CSV un peu plus compliquées (par exemple, il a intégré des virgules), utilisez le module de bibliothèque standard 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" 
Questions connexes