2013-08-21 5 views
0

Groovy를 처음 사용하지만 오랫동안 Java 개발자였습니다. 몇 가지 통계를 실행하려고하는데 사용하기 위해 두 개의 파일이 주어졌으며 Groovy 스크립트가이를 위해 잘 작동 할 것이라고 생각했습니다. 내가 뭘하고 싶은 건 하나의 CSV 파일에서 다른 CSV 파일에없는 userID를 결정하는 것입니다. 예를 들면 :Groovy CSV 파일 비교

모든 users.csv :

joe 
bobby 
jane 
fred 

일부-users.csv :

fred 
jane 

내가 사용자 아이디가 'some-에 포함되지되는 통계를 싶습니다 users.csv '파일에 있습니다. 이 경우 joe와 bobby (2 명의 사용자)는 some-users.csv에 없습니다.

파일의 내용을 컬렉션으로로드 한 다음 diff 또는 비교를 수행하는 데 대한 간단한 문서를 찾을 수 없습니다. 어떤 아이디어?

감사합니다.

+0

당신이 한 줄에 하나의 이름으로 실제 쉼표로 구분 된 값 파일, 아니면 그냥 파일을 의미합니까 : 여기에 내가 그 최선을 작동하는 것 같다 해낸 무엇인가? –

답변

2

한 줄에 하나의 사용자와 파일이 가정하면, 다만 할 수 있습니다

[ '/tmp/all-users.csv', '/tmp/some-users.csv' ].collect { new File(it).text } 
               .collect { it.tokenize('\n') } 
               .inject { accum, e -> accum - e } 
이이 같은 일을하여 초기 파일을 여러 개의 파일을 벗고 일반화 될 수

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' ] 

실제로 CSV가있는 경우 각 파일의 이름 목록을 얻으려면 몇 가지 추가 구문 분석 (with a CSV parser)을 수행해야합니다.

1

파일을 메모리에 저장 :

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

이것은 파일의 모든 행을로드/처리하는 매우 일반적인 방법입니다. 사용 사례 : 추가 구문 분석 등을 만들고 각 라인에 대한 객체를 채우는

그런 다음 당신이 그들 사이의 차이를 계산할 수 있습니다 : 제안 된 솔루션뿐만 아니라 좀 더 연구를 수행 한 후

allUsers - someUsers 
0

을 _ "CSV"_ 의해

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)