【问题标题】:Using ruby to write out to a csv file from sqlite database使用 ruby​​ 从 sqlite 数据库写入 csv 文件
【发布时间】:2016-08-22 05:55:00
【问题描述】:

我无法弄清楚以下 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 和一般编程,如果我的问题是基本问题,我深表歉意。

谢谢 艾米

【问题讨论】:

    标签: ruby csv


    【解决方案1】:

    另请参阅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 获取数组的所有条目并将它们连接成一个字符串。 (可选)参数定义两个元素之间的内容。因此,在您的代码中,您将所有条目作为带有制表符分隔符的 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2013-10-21
      • 2012-05-04
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多