Как разделить строку CSV в Ruby? - PullRequest
3 голосов
/ 14 октября 2010

У меня есть эта строка в качестве примера из файла CSV:

2412,21,"Which of the following is not found in all cells?","Curriculum","Life and Living Processes, Life Processes",,,1,0,"endofline"

Я хочу разбить ее на массив.Непосредственная мысль состоит в том, чтобы просто разделить запятые, но в некоторых строках есть запятые, например, «Жизнь и жизненные процессы, жизненные процессы», и они должны оставаться как отдельные элементы в массиве.Также обратите внимание, что есть две запятые, между которыми нет ничего - я хочу получить их как пустые строки.

Другими словами, массив, который я хочу получить, -

[2412,21,"Which of the following is not found in all cells?","Curriculum","Life and Living Processes, Life Processes","","",1,0,"endofline"]

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

ура, макс

Ответы [ 5 ]

9 голосов
/ 14 октября 2010

Это не подходит для регулярных выражений. Вам нужен парсер CSV, а в Ruby есть один встроенный:

http://ruby -doc.org / STDLIB / libdoc / CSV / RDoc / классы / CSV.html

И, возможно, превосходящая библиотека третьей части:

http://fastercsv.rubyforge.org/

3 голосов
/ 14 октября 2010
str=<<EOF
2412,21,"Which of the following is not found in all cells?","Curriculum","Life and Living Processes, Life Processes",,,1,0,"endofline"
EOF
require 'csv' # built in

p CSV.parse(str)
# That's it! However, empty fields appear as nil.
# Makes sense to me, but if you insist on empty strings then do something like:
parser = CSV.new(str)
parser.convert{|field| field.nil? ? "" : field}
p parser.readlines
2 голосов
/ 14 октября 2010
text=<<EOF
2412,21,"Which of the following is not found in all cells?","Curriculum","Life and Living Processes, Life Processes",,,1,0,"endofline"
EOF
x=[]
text.chomp.split("\042").each_with_index do |y,i|
  i%2==0 ?  x<< y.split(",") : x<<y
end
print x.flatten

выход

$ ruby test.rb
["2412", "21", "Which of the following is not found in all cells?", "Curriculum", "Life and Living Processes, Life Processes", "", "", "", "1", "0", "endofline"]
2 голосов
/ 14 октября 2010

РЕДАКТИРОВАТЬ: мне не удалось прочитать тег Ruby. Хорошей новостью является то, что руководство объяснит теорию, которая стоит за этим, даже если языковые особенности не верны. К сожалению.

Вот фантастическое руководство для этого:

http://knab.ws/blog/index.php?/archives/10-CSV-file-parser-and-writer-in-C-Part-2.html

и писатель CSV здесь:

http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html

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

1 голос
/ 14 октября 2010

Этим утром я наткнулся на проект CSV Table Importer для Ruby-on-Rails. В конце концов вы найдете код полезным:

Github TableImporter

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