我是Groovy的新手,但我很长一段时间以来一直是Java开发人员。我正在尝试运行一些统计信息,并且已经使用了两个文件,并认为Groovy脚本可以很好地用于此。我想要做的是确定一个CSV文件中的哪些用户ID不在另一个CSV文件中。例如:
全users.csv:
joe
bobby
jane
fred
一些-users.csv:
fred
jane
我想要'some-users.csv'文件中没有包含userID的统计信息。在这种情况下,joe和bobby(2个用户)不在some-users.csv中。
我找不到任何关于将文件内容加载到Collection中然后进行diff或比较的简单文档。有什么想法吗?
谢谢!
答案 0 :(得分:2)
假设每行有一个用户的文件,你可以这样做:
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,那么您需要进行一些额外的解析(最好是with a CSV parser)以获取每个文件的名称列表
答案 1 :(得分:1)
您可以使用以下命令将文件加载到内存中:
def allUsers= []
new File("all-users.csv").eachLine { line -> allUsers.add(line) }
这是加载/处理文件中所有行的非常通用的方法。用例:为每一行添加任何其他解析,创建和填充对象等。
然后你可以用以下方法计算它们之间的差异:
allUsers - someUsers
答案 2 :(得分: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)