2013-08-21 106 views
0

我是Groovy的新手,但我很长一段时间一直是Java开发人员。我正在尝试运行一些统计信息,并且已经给出了两个文件供用户使用,并且认为Groovy脚本可以很好地工作。我想要做的是确定一个CSV文件中的哪些用户标识不在另一个CSV文件中。例如:Groovy CSV文件比较

全users.csv:

joe 
bobby 
jane 
fred 

一些-users.csv:

fred 
jane 

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

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

谢谢!

+0

由_“CSV” _你的意思是一个实际的逗号分隔值文件,或每行一个名字只是一个文件? –

回答

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

你可以l将文件加载到内存中:

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

这是加载/处理文件中所有行的非常通用的方式。使用情况:任何额外的解析,建立和每行填充物等

然后你可以计算与它们之间的区别:

allUsers - someUsers 
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)