使用ruby从sqlite数据库

时间:2016-08-21 16:17:45

标签: ruby csv

我无法弄清楚下面Ruby程序的功能。我知道我们正在打开xxx.csv&创建9列,但我不明白以下内容:

out <<do |out|(1..10).map{|i| "r" + i.to_s}(1..10代表一组1到10 ???),map方法及其参数,{{{ 1}}。

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"

我正在学习Ruby和一般的编程,如果我的问题是基本的,我会道歉。

由于 艾米

1 个答案:

答案 0 :(得分:0)

另请参阅Export content of a SQLite3 table in 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获取数组的所有条目并将它们连接成一个字符串。 (可选)参数定义两个元素之间的内容。因此,在您的代码中,您将所有条目作为带有tab-separartor的csv-line。

最后添加换行符。

分步骤:

["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"