См. также Экспорт содержимого таблицы 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