Как разделить две данные в одной ячейке на CSV по ruby - PullRequest
0 голосов
/ 30 мая 2018

Я хочу изменить содержимое файла CSV:

itemId,url,name,type
1|urlA|nameA|typeA
2|urlB|nameB|typeB
3|urlC,urlD|nameC|typeC
4|urlE|nameE|typeE

в массив:

[itemId,url,name,type]
[1,urlA,nameA,typeA]
[2,urlB,nameB,typeB]
[**3**,**urlC**,nameC,typeC]
[**3**,**urlD**,nameC,typeC]
[4,urlE,nameE,typeE]

Может кто-нибудь научить меня, как это сделать?Наконец, я собираюсь перейти к файлам DL url (.jpg)

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вам нужно будет проверить пятый столбец, чтобы увидеть, как должна быть проанализирована строка.Если вы видите пятый элемент (строка [4]), выведите строку дважды, заменяя столбец url

array = Array.new
CSV.foreach("test.csv") do |row|
  if row[4]
    array << [row[0..1], row[3..4]].flatten
    array << [[row[0]], row[2..4]].flatten
  else
    array << row
  end
end
p array

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

0 голосов
/ 30 мая 2018

Строка заголовка имеет другой разделитель, чем данные.Это проблема.Вам нужно изменить строку заголовка, чтобы использовать | вместо ,.Тогда:

require 'csv'
require 'pp'

array = Array.new
CSV.foreach("test.csv", col_sep: '|', headers: true) do |row|
  if row['url'][/,/]
    row['url'].split(',').each do |url|
      row['url'] = url
      array.push row.to_h.values
    end
  else
    array.push row.to_h.values
  end
end

pp array

=> [["1", "urlA", "nameA", "typeA"],
    ["2", "urlB", "nameB", "typeB"],
    ["3", "urlC", "nameC", "typeC"],
    ["3", "urlD", "nameC", "typeC"],
    ["4", "urlE", "nameE", "typeE"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...