Разбиение текстового файла дважды в Ruby - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть следующий текстовый файл.

bob jones,19,moore reef,yes,no
jenny smith, 21,reef park,yes,yes
any body, 12,somewhere,no,no

Я бы хотел, чтобы каждая строка была в отдельном массиве, ИЛИ Я бы хотел, чтобы отдельные массивы были для каждой части данных (например, name_array, age_array, destination_array и т. Д.).

Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

Загрузите его с помощью анализатора CSV из стандартной библиотеки:

require 'csv'
a = CSV.open('x.csv').map { |r| r.map(&:strip) }

Это даст вам a, как это:

[
    [ "bob jones",   "19", "moore reef", "yes", "no"  ],
    [ "jenny smith", "21", "reef park",  "yes", "yes" ],
    [ "any body",    "12", "somewhere",  "no",  "no"  ]
]

Затем вы можете использовать b = a.transpose, чтобы перевернуть строки и столбцы, чтобы получить это в b:

[
    [ "bob jones", "jenny smith", "any body" ],
    [ "19", "21", "12" ],
    [ "moore reef", "reef park", "somewhere" ],
    [ "yes", "yes", "no" ],
    [ "no", "yes", "no" ]
]

А затем оттуда вы можете вытащить отдельные массивы, если хотите:

names, ages, destinations, flags1, flags2 = *b

Мне нужно было угадать имена flags1 и flags2.

1 голос
/ 12 сентября 2011

Разделите файл на строки с readlines, затем для каждой строки используйте String#split через запятую.Затем, если вам нравится (для вашего «второго пути») транспонирование.

Учитывая файл people.txt

bob jones,19,moore reef,yes,no
jenny smith, 21,reef park,yes,yes
any body, 12,somewhere,no,no

, тогда строки файла будут сжаты следующим образом:

people = IO.readlines("people.txt")
p people

Это дает

["bob jones,19,moore reef,yes,no\n", 
 "jenny smith, 21,reef park,yes,yes\n", 
 "any body, 12,somewhere,no,no"]

В этот момент у вас есть несколько дополнительных строк новой строки, но они исчезают, когда вы обрабатываете строку за строкой, добавляя String#chomp:

result = []
people = IO.readlines("people.txt")
people.each {|line| result << line.chomp.split(",")}
p result

Это дает

[["bob jones", "19", "moore reef", "yes", "no"], 
 ["jenny smith", " 21", "reef park", "yes", "yes"], 
 ["any body", " 12", "somewhere", "no", "no"]]

Вторая часть вашего вопроса - как получить ломтиков на столбец.Самый простой способ - использовать transpose.Вот так:

result = []
people = IO.readlines("people.txt")
people.each {|line| result << line.chomp.split(",")}
p result.transpose

Это дает

[["bob jones", "jenny smith", "any body"], 
 ["19", " 21", " 12"], 
 ["moore reef", "reef park", "somewhere"], 
 ["yes", "yes", "no"], 
 ["no", "yes", "no"]]

ОБНОВЛЕНИЕ Я должен был отредактировать свой ответ, чтобы добавить его в chomps!Также, к вашему сведению, вы также можете добавить некоторые обрезки строк.Я позволю тебе посмотреть это.: -)

0 голосов
/ 03 октября 2011

Я сделал это так;

f1 = File.open(filename,"r")                
f1.each do | line|
  i += 1 
  data = line.split(',')
  #store data into arrays
  passenger_name[i] = data[0] #passenger's name
  passenger_age[i] = data[1]
  passenger_destination[i] = data[2]
  passenger_meal[i] = data[3]
  passenger_dive[i] = data[4]
  end

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

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