2

現在ライブラリorg.apache.commons.csv 2.4を使用して、groovyでcsvファイルを解析しようとしています。私が持っている要件は、csv セルに無効な文字などの無効なデータ値があり、最初の無効な行/セルで例外をスローする代わりに、これらの例外を収集し、最後まで csv ファイルで反復し続けたいということです。次に、この csv ファイルに含まれる無効なデータの完全なリストが表示されます。

その目的で、この apache lib を使用する複数の方法を試しましたが、残念ながら反復に CSVParser.getNextRecord() を使用している限り、反復子は中止されます。

次のようなコードを入力します。

    def  records = new CSVParser(reader, CSVFormat.EXCEL.withHeader().withIgnoreSurroundingSpaces())

     // at this line, the iterator() inside CSVParser is always using getNextRecord() for its next() implementation, and it may throw exception on invalid char
     records.each {record->
         // if the exception is thrown from .each, that makes below try/catch in vain
         try{

         }catch(e){ //want collect Errors here }
     }

では、この図書館で掘り下げるべきものは他にありますか? または、誰かが私に別のより実行可能な解決策を教えてもらえますか? みんなに感謝します!

更新: サンプル CSV

"Company code for WBS element","WBS Element","PS: Short description (1st text line)","Responsible Cost Center for WBS Element","OBJNR","WBS Status"

"1001","RE-01768-011","Opex - To present a paper on Career con","0000016400","PR00031497","X"
"1001","RE-01768-011","Opex - To present a paper on "Career con","0000016400","PR00031497","X"

2 番目のデータ行に無効な文字"が含まれているため、パーサーは例外をスローします

4

2 に答える 2

2

問題は、1 つのセル内の文字の 1 つが、quote選択した形式に従ってパーサーによって使用される文字であることです: CSVFormat.EXCEL.

引用文字は

特殊文字を含む値をカプセル化するために使用される文字

あなたの例では、引用符が誤用されており、パーサーはそれについて不平を言っています。

別の を使用して回避できますCSVFormat。たとえば、引用符のないもの:

@Grapes(
    @Grab(group='org.apache.commons', module='commons-csv', version='1.2')
)

import java.nio.charset.*
import org.apache.commons.csv.*

def text = '''"Company code for WBS element","WBS Element","PS: Short description (1st text line)","Responsible Cost Center for WBS Element","OBJNR","WBS Status"

"1001","RE-01768-011","Opex - To present a paper on Career con","0000016400","PR00031497","X"
"1002","RE-01768-011","Opex - To present a paper on "Career con","0000016400","PR00031497","X"
"1003","RE-01768-011","Opex - To present a paper on Career con","0000016400","PR00031497","X"'''

def parsed = CSVParser.parse(text, CSVFormat.EXCEL.withHeader().withIgnoreSurroundingSpaces().withQuote(null))

parsed.getRecords().each {
    println it.toMap().values()
}

そして、上記の結果:

[]
["0000016400", "1001", "RE-01768-011", "Opex - To present a paper on Career con", "X", "PR00031497"]
["0000016400", "1002", "RE-01768-011", "Opex - To present a paper on "Career con", "X", "PR00031497"]
["0000016400", "1003", "RE-01768-011", "Opex - To present a paper on Career con", "X", "PR00031497"]

もちろん、上記の回避策では、各フィールドに引用符( ) が含まれています。"

必要に応じて、それらをすべて置き換えることができます。

parsed.getRecords().each {
    println it.toMap().values().collect({ it.replace('"', '') })
}
于 2015-11-11T14:45:04.173 に答える
0

問題は、csv ファイルに無効なデータ、つまり csv 形式の規則に違反するデータが含まれている場合、パーサーが解析できないことです。そのため、最初に発生したエラー以外は確実に解析できません。

于 2015-11-11T11:29:01.920 に答える