如何在飞行中打印到不同的文件?

时间:2011-06-16 15:01:42

标签: ruby groovy logic

如何根据内容将动态生成和排序的数组的内容打印到不同的文件?

例如,假设我们有以下多维数组,按第二列

排序
[ ['Steph', 'Allen', 29], ['Jon', 'Doe', 30], ['Jane', 'Doe', 30], ['Tom', 'Moore', 28] ]

目标是拥有3个文件:

last_name-Allen.txt< - 包含Steph Allen 29

last_name-Doe.txt< - 包含Jon Doe 30 Jane Doe 30

last_name-Moore.txt< - 包含Tom Moore 28

7 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

如果您想在Groovy中执行此操作,可以使用groupBy方法获取基于姓氏的地图,如下所示:

// Start with your list
def list = [ ['Steph', 'Allen', 29], ['Jon', 'Doe', 30], ['Jane', 'Doe', 30], ['Tom', 'Moore', 28] ]

// Group it by the second element...
def grouped = list.groupBy { it[ 1 ] }

println grouped

打印

[Allen:[[Steph, Allen, 29]], Doe:[[Jon, Doe, 30], [Jane, Doe, 30]], Moore:[[Tom, Moore, 28]]]             

然后,遍历此地图,为每个姓氏打开一个新文件并将内容写入(在此示例中分隔的标签)

grouped.each { surname, contents ->
  new File( "last_name-${surname}.txt" ).withWriter { out ->
    contents.each { person ->
      out.writeLine( person.join( '\t' ) )
    }
  }
}

答案 2 :(得分:1)

在红宝石中:

array.each{|first, last, age| open("last_name-#{last}.txt", "a"){|io| io.write([first, last, age, nil].join(" ")}}

它在文件末尾添加了额外的空格。这是为了在有另一个实体添加时保留空间。

答案 3 :(得分:0)

使用带有姓氏的哈希作为键,然后遍历哈希并将每个键/值对写入其自己的文件。

答案 4 :(得分:0)

在Groovy中,你可以这样做:

def a = ​[['Steph', 'Allen', 29], ['Jon', 'Doe', 30], ['Jane', 'Doe', 30], ['Tom', 'Moore', 28]]

a.each { 
    def name = "last_name-${it[1]}.txt"
    new File(name) << it.toString()
}

可能有更短(更长)的方式来做到这一点。

答案 5 :(得分:0)

您可以创建一个散列,其中“second column”为键,值为“file handle”。如果你得到哈希的密钥,只需获取文件句柄并写入,否则创建新的文件句柄并插入哈希。

答案 6 :(得分:0)

这个答案在Ruby中:

# hash which opens appropriate file on first access
files = Hash.new { |surname| File.open("last_name-#{surname}.txt", "w") }

list.each do |first, last, age|
  files[last].puts [first, last, age].join(" ")
end

# closes all the file handles
files.values.each(&:close)