2014-04-14 65 views
1

我试图解析一个CSV文件列表,我通过在目录上递归获得。下面打印的代码只有一条线,然后存在与流闭合差:CsvParser流解析多个文件时出现关闭错误

def stageDir = new File(STAGE_DIR), listOfFiles = [], filesData = [] 
// Get the list of files 
stageDir.eachFileRecurse(FileType.FILES) { file -> 
    listOfFiles << file 
} 

// Start parsing each CSV file in the list 
listOfFiles.each { file -> 
    def csvData = file.withReader { 
     new CsvParser().parse(it , separator: CSV_SEPARATOR) 
    } 

    // Here i put the returned csvData (of type CsvIterator) in the filesData 
    filesData.add(csvData) 
} 

// I checked filesData and it's not empty, so i iterate over it. 

// HERE I GET : Stream Closed error 
// I'm just trying to test by printing the first line of myIt 
// (but is there a more efficient way to iterate over CsvIterator ?) 
for (myIt in filesData) { 
    println myIt[0].ID + " " + myIt[0].NAME 
} 

是否有使用CsvParser多个文件,避免流关闭错误一个更好的办法吗?

回答

1

您不会将filesData解析数据添加到new File('').withReader{}返回的实际结果中,这可能是流或其他任何内容。相反,尝试:

listOfFiles.each { file -> 
    def csvData = file.withReader { 
     filesData.add(new CsvParser().parse(it , separator: CSV_SEPARATOR)) 
    } 
} 

UPDATE

如果您遍历filesData正确我也怀疑。在每个循环中,myIt不是数据行,而是从parse方法返回的Iterable的实例。目前无法进行实验,但也许应该是。对Groovy控制台

for (myIt in filesData) { 
    myIt.each { rowIt -> 
    println rowIt.ID + " " + rowIt.NAME 
    } 
} 

更新2

工作实例

@Grab('com.xlson.groovycsv:groovycsv:1.0') 
import com.xlson.groovycsv.CsvParser 

def csv1 = '''ID,NAME,ADDRESS 
1,n1,a1 
2,n2,a2 
3,n3,a3''' 

def csv2 = '''ID,NAME,ADDRESS 
4,n4,a4 
5,n5,a5 
6,n6,a6 
''' 
def listOfFiles = [csv1, csv2] 
def filesData = [] 

listOfFiles.each { filesData.add(new CsvParser().parse(it , separator: ',')) } 

filesData.each { d -> 
    d.each { r -> 
     println "$r.ID $r.NAME" 
    } 
} 

什么,你需要做的是检查是否所有文件操作中你所提供的例子平稳运行。

更新3:d

这里的示例代码再现错误:

@Grab('com.xlson.groovycsv:groovycsv:1.0') 
import com.xlson.groovycsv.CsvParser 

def f1 
def f2 

try { 
    f1 = File.createTempFile("temp1",".csv") 
    f2 = File.createTempFile("temp2",".csv") 
    f1.text = '''ID,NAME,ADDRESS 
1,n1,a1 
2,n2,a2 
3,n3,a3 
''' 

    f2.text = '''ID,NAME,ADDRESS 
4,n4,a4 
5,n5,a5 
6,n6,a6 
''' 
    def listOfFiles = [f1, f2] 
    def filesData = [] 

    listOfFiles.each { f -> 
     f.withReader { r -> 
      def data = new CsvParser().parse(r , separator: ',') 
      filesData.add(data) 
     } 
    } 

    filesData.each { d -> 
     d.each { r -> 
      println "$r.ID $r.NAME" 
     } 
    } 
} finally { 
    f1?.delete() 
    f2?.delete() 
} 

现在..什么是怎么回事。在withReader关闭parse方法CsvParserr(读者)对象通过调用。但withReader封闭不积极评估,但懒洋洋。然后在解析的数据被打印在r的地方被读出并同时常规检测EOF自动关闭流(它可容易地与变更3,n3,a3\n'''3,n3,a3'''验证,但类au.com.bytecode.opencsv.CSVReadergetNextLine()方法)不检查如果流关闭并尝试读取它导致Stream closed例外,实际上这是CSVReader类中的一个错误

纠正它您需要将懒读取更改为渴望这可以通过更改此行代码来完成:

filesData.add(data) 

to th是:

filesData.add(data.toList()) 

这会导致数据在闭包中读取,而不是留在稍后读取。

+0

仍然收到java.io.IOException:Stream在同一行上关闭:println myIt [0] .ID +“”+ myIt [0] .NAME! – amrfaissal

+0

好的。网络上的任何示例项目?准备尝试? – Opal

+0

我看过的示例处理一个文件和一个返回的CsvIterator不是多个文件:( – amrfaissal

2

回到当天,当文件关闭并且您试图从中读取时,异常是预期的结果。

但是不要害怕!OpenCSV项目有一个新的活跃开发者Maciek,他不仅将项目更新为Java 7(因为不再支持5和6),他已将CSVReader更改为不抛出IOException,而是安静地处理它。

我们已将此版本推送出Sourceforge as version 3.0。请随时进行测试,并将xlson库更新为新版本。

我不得不说我很荣幸看到我们的工作在其他项目中结束。它就像一个吉他制造者发现一个着名的摇滚乐队使用你的吉他。

相关问题