Использование ruby ​​для записи в файл csv из базы данных sqlite

Я не мог понять функциональность приведенной ниже программы Ruby. Я знаю, что мы открываем xxx.csv и создаем 9 столбцов, но я не понимаю следующее:

out <<, do |out|, (1..10).map{|i| "r" + i.to_s} (1..10 представляют набор от 1 до 10 ???), метод map и его аргумент, и flatten.join("\t") + "\n".

File.open("xxxx.csv", "w") do |out|
out << [
    'x', 'y', 'l', 'b', 
    'r', 'v', (1..10).map{|i| "r" + i.to_s}, 
    'xxx', 'd'
].flatten.join("\t") + "\n"

Пример данных: 13/#137/2011/0/15/5.8/5/4.....2..4/PG

Я изучаю Ruby и программирование в целом и прошу прощения, если мой вопрос базовый.

Спасибо, Эми.


person amy jones    schedule 21.08.2016    source источник


Ответы (1)


См. также Экспорт содержимого таблицы SQLite3 в CSV. чтобы получить ответ на вашу проблему.


Но объяснить код. Попробуем по частям:

p (1..10).map{|i| "r" + i.to_s}

результат:

["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"]

Теперь давайте сделаем это подробнее: (1..10) — это объект Range. Если вы выполните

(1..10).to_a

вы получаете массив от 1 до 10: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].

map зацикливается на объектах диапазона и создает новый массив с результатом данного блока. Таким образом, (1..10).map{|i| "r" + i.to_s} перебирает все значения в диапазоне от 1 до 10, дает значение внутренней переменной блока i и создает новую строку с r и (+) строковым представлением числа i (to_s означает строку).

Итого у вас получится вот такой массив:

["x", "y", "l", "b", "r", "v", 
   ["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"], 
  "xxx", "d"
]

flatten делает массив плоским. Если в массиве есть массив, то flatten разрешает внутренний массив(ы) и делает его "плоским"

Пример:

[1,[2,3]].flatten  #[1, 2, 3]

join берет все элементы массива и объединяет их в строку. Параметр (необязательный) определяет содержимое между двумя элементами. Итак, в вашем коде вы получаете все записи в виде строки csv с разделителем табуляции.

И в конце добавляется новая строка.

По шагам:

["x", "y", "l", "b", "r", "v", 
   ["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"], 
  "xxx", "d"
].flatten

приводит к

["x", "y", "l", "b", "r", "v", 
   "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", #No inner array any longer
  "xxx", "d"
]

Затем выполняется соединение:

["x", "y", "l", "b", "r", "v", 
   "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", 
  "xxx", "d"
].join("\t")

результат:

"x\ty\tl\tb\tr\tv\tr1\tr2\tr3\tr4\tr5\tr6\tr7\tr8\tr9\tr10\txxx\td"
person knut    schedule 21.08.2016