2016-08-21 60 views
0

我找不出下面的Ruby程序的功能。我知道,我们是开放xxx.csv &创建9列,但我不明白以下几点:使用ruby从sqlite数据库写出一个csv文件

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和编程一般和道歉,如果我的问题是一个基本的。

感谢 艾米

回答

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和(+)建立一个新的字符串,数字ito_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" 
+0

谢谢克努特。 –

相关问题