1

我是 Groovy 的新手,但我从事 Java 开发人员已有很长时间了。我正在尝试运行一些统计信息,并获得了两个文件可供使用,并认为 Groovy 脚本可以很好地解决这个问题。我想做的是确定一个 CSV 文件中的哪些用户 ID 不在另一个 CSV 文件中。例如:

所有用户.csv:

joe
bobby
jane
fred

一些用户.csv:

fred
jane

我想要“some-users.csv”文件中不包含哪些用户 ID 的统计信息。在这种情况下,joe 和 bobby(2 个用户)不在 some-users.csv 中。

我找不到任何关于将文件内容加载到集合中然后进行差异或比较的简单文档。有任何想法吗?

谢谢!

4

3 回答 3

3

假设您的文件每行只有一个用户,您可以这样做:

def allUsers = new File( '/tmp/all-users.csv' )
def someUsers = new File( '/tmp/some-users.csv' )
def diff = allUsers.text.tokenize( '\n' ) - someUsers.text.tokenize( '\n' )

assert diff == [ 'joe', 'bobby' ]

这可以概括为通过执行以下操作从初始文件中取出多个文件:

[ '/tmp/all-users.csv', '/tmp/some-users.csv' ].collect { new File( it ).text }
                                               .collect { it.tokenize( '\n' ) }
                                               .inject  { accum, e -> accum - e }

如果您确实有 CSV,那么您需要进行一些额外的解析(最好使用 CSV 解析器)来获取每个文件的名称列表

于 2013-08-21T13:57:05.733 回答
1

您可以使用以下命令将文件加载到内存中:

def allUsers= []    
new File("all-users.csv").eachLine { line -> allUsers.add(line) }

这是一种非常通用的加载/处理文件中所有行的方法。用例:任何额外的解析、为每一行创建和填充对象等。

然后你可以计算它们之间的差异:

allUsers - someUsers
于 2013-08-21T14:00:20.973 回答
0

在做了更多的研究以及提出的解决方案之后,这是我想出的似乎效果最好的方法:

def allUsers = new File("all-users.rtf").readLines()
def someUsers = new File("some-users.rtf").readLines()
def count = 0

allUsers.each {
    if (!someUsers.contains(it)) {
        count++
    }
}
println(count)
于 2013-08-22T16:13:56.297 回答