2013-08-21 57 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)