Last active
December 23, 2015 18:59
-
-
Save josefbetancourt/6680049 to your computer and use it in GitHub Desktop.
Code to accompany "Parsing files using Groovy closures" on my blog.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.octodecillion | |
import java.nio.file.Files; | |
/** | |
* Simple folder walker and file parser. | |
* <p> | |
* Dev with Groovy 2.1.6, Java 7, Eclipse 4.3 | |
* | |
* @author jbetancourt | |
* | |
*/ | |
class Gather { | |
/** test file name with filter, if true, iterate lines | |
* and collect data via strainer. | |
* <p> | |
* @param file the file | |
* @param filter file name filter | |
* @param strainer line strainer | |
* @return List<List<Object>> | |
*/ | |
static gather(File file, Closure strainer) { | |
def all = [] | |
file.eachLine{ line -> | |
def list = strainer(line) | |
if(list.size){ | |
all << list | |
} | |
} | |
return all | |
} | |
/** Gather files in a folder */ | |
static gather(File folder, Closure filter, Closure strainer) { | |
def all = [] | |
folder.eachFile { file -> | |
if(filter(file)){ | |
all << gather(file, strainer) | |
} | |
} | |
return all | |
} | |
/** Gather files in a folder */ | |
static gatherRecurse(File folder, Closure filter, Closure strainer) { | |
def all = [] | |
folder.eachFileRecurse { | |
if(filter(file)){ | |
file.eachLine{ line -> | |
def list = strainer(line) | |
if(list.size){ | |
all << list | |
} | |
} | |
} | |
} | |
return all | |
} | |
/** a test */ | |
static main(args) { | |
def folder= Files.createTempDirectory("tempFolder") | |
folder.toFile().deleteOnExit() | |
def f = Files.createTempFile(folder, "test", ".log") | |
f.toFile().deleteOnExit() | |
f.toFile().text = | |
''' | |
# test data | |
20120817 Foo.java | |
# 2 20120817 Foo.java | |
2013 Fee.java | |
''' | |
def list = Gather.gather(folder.toFile(), { file -> | |
file.name.matches(/.*\.log/) }) { line -> | |
def m = line ==~ /^\s*\d{8}\s+\S+\.java.*/ | |
if(m){ | |
return [line] | |
} | |
return [] | |
} | |
assert list.size == 1 // has [[[ 20120817 Foo.java]]] | |
def result = list[0][0] // [ 20120817 Foo.java] | |
assert result[0] == ' 20120817 Foo.java' | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment