Ruby: есть ли способ разбить строку только по первым x вхождениям? - PullRequest
2 голосов
/ 04 апреля 2010

Например, предположим, у меня есть это:

001, "john doe", "male", 37, "programmer", "likes dogs, women, and is lazy"

Проблема в том, что в строке должно быть только 6 полей. Но если я разделю его разделением, я получу больше из-за неправильного использования запятой для разделения полей.

Прямо сейчас я делю все, затем, когда я иду к 5-му индексу вперед, я объединяю все строки. Но мне было интересно, был ли раскол (",", 6) или что-то в этом роде.

Ответы [ 2 ]

7 голосов
/ 04 апреля 2010

Ruby содержит CSV-модуль в стандартной библиотеке. Он будет делать то, что вам действительно нужно здесь (игнорируйте запятые в двойных кавычках).

require 'CSV.rb'
CSV::Reader.parse("\"cake, pie\", bacon") do |row| p row; end

результат:

["cake, pie", " bacon"]
=> nil

Возможно, вы захотите лишить результатов, если вы неясны, как я, и везде будете вставлять пробелы.

3 голосов
/ 04 апреля 2010

Да, вы можете сделать the_string.split(",", 6). Однако это все равно даст «неправильный» результат, если в кавычках где-то посередине есть запятая (например, 001, "doe, john",...).

Однако использование Shellwords здесь может быть более уместным, поскольку это также позволит другим разделам, кроме последнего, содержать запятые внутри кавычек (это также удалит кавычки, которые могут быть или не быть проблемой, в зависимости от того, что пытаюсь сделать).

Пример:

require 'shellwords'
the_string = %(001, "doe, john", "male", 37, "programmer", "likes dogs, women, and is lazy")
Shellwords.shellwords the_string
#=> ["001,", "doe, john,", "male,", "37,", "programmer,", "likes dogs, women, and is lazy"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...