2011-12-28 1 views
2

У меня есть этот большой XML-файл. Есть поле, в котором я хочу разделить поле по пространству.Невозможно разбить/удалить пробел в строке в Ruby, потому что это символ NBSP

Так что я сделать следующее, чтобы сохранить расщепленные данные в & б:

components = a.split(' ') 
a = components[0] 
b = components[1] 

Однако некоторые расщепляются правильно, но некоторые из них не (когда все они содержат пробелы). Например, когда я пытаюсь разделить 'Maria Canada', он не разделяется пробелом.

Я не уверен, почему. Если открыть файл в Vim и скопировать этот конкретный неправильный текст, я могу разделить их правильно рубиновую интерактивную оболочку:

'Maria (Canada)'.split(' ') 
=> ["Maria","(Canada)"] 

UPDATE

Ok причина NBSP. Я распечатал те строки, которые не разбиваются на консоль, вызывая ошибки. Я скопировал текст и вставил в irb. Этот скопированный текст также нельзя разделить на irb, и я не могу разделить это пространство.

>> ' '.strip 
=> " " 

Я затем запустить ord и обнаружил, что пространство является символом NBSP (его код 160):

>> ' '.ord 
=> 160 

Так файл XML содержит пространство и символы NBSP. Я думаю, что Vim автоматически конвертирует NBSP в пробелы, и именно поэтому, когда я пытался копировать его из vim, это больше не NBSP.

Теперь мне просто нужно выяснить, как бороться с NBSP.

+0

Представьте себе, что вы читаете этот вопрос без какой-либо предыдущей мысли о том, что вы делаете , Как вы думаете, вы можете понять, о чем идет речь? – sawa

+0

Извините, что я попытался прояснить это немного – lulalala

+0

Возможно, это на самом деле символ табуляции? попробуйте a.split (/ \ s + /) и посмотрите, помогает ли это. – pguardiario

ответ

11

Вы должны разделиться на всех непечатаемых, включая не-ASCII:

a, b = str.split(/[[:space:]]/) 

Я предполагаю, что вы используете Ruby 1.9+ и что ваш str имеет правильное кодирование (например, UTF-8). Как объяснялось в regex reference, \s соответствует только ASCII пространств, в то время как [[:space:]] будет соответствовать всем Юникода пространства (то же самое для \d против [[:digit:]] и т.д ...)

+0

ничего себе, так приятно иметь это встроенное – lulalala

5

Когда я обрабатывал много XML, я столкнулся с аналогичными проблемами.

Вместо того, чтобы пытаться удалить NBSP после разбора, иногда я вижу, появляются ли они в кодированной форме в необработанном XML, а затем выполняет глобальный поиск и заменяет до того, как я разобрался. Ищите   или \xa0 или что-то подобное в этих положениях.

В качестве альтернативы, вы можете сделать несколько других вещей:

Вы можете изменить свой раскол на что-то умнее:

# encoding: UTF-8 

NBSP = "\u00a0" 

str = "a b\tc#{ NBSP }z" 
str.split(/(?:\s|#{ NBSP })+/) # => ["a", "b", "c", "z"] 

или

str.gsub(NBSP, ' ').split(' ') 
=> ["a", "b", "c", "z"] 

 Смежные вопросы

  • Нет связанных вопросов^_^