Apache Commons CSV 1.2 を使用して Java で解析している 37 列の CSV ファイルがあります。私のセットアップコードは次のとおりです。
//initialize FileReader object
FileReader fileReader = new FileReader(file);
//intialize CSVFormat object
CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER_MAPPING);
//initialize CSVParser object
CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);
//Get a list of CSV file records
List<CSVRecord> csvRecords = csvFileParser.getRecords();
// process accordingly
私の問題は、処理する CSV をターゲット ディレクトリにコピーして解析プログラムを実行すると、次のエラーが発生することです。
Exception in thread "main" java.lang.IllegalArgumentException: Index for header 'Title' is 7 but CSVRecord only has 6 values!
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:110)
at launcher.QualysImport.createQualysRecords(Unknown Source)
at launcher.QualysImport.importQualysRecords(Unknown Source)
at launcher.Main.main(Unknown Source)
ただし、ファイルをターゲット ディレクトリにコピーし、開いて保存し、プログラムを再試行すると、機能します。CSV を開いて保存すると、最後に必要なコンマが追加されるため、プログラムは、読み取るヘッダーが不足していることに不満を抱くことはありません。
コンテキストとして、保存前/保存後のサンプル行を次に示します。
変更前 (失敗): "data","data","data","data"
後 (作業中): "data","data",,,,"data",,,"data",,,,,,
私の質問: CSV 形式を開いて保存すると、なぜ CSV 形式が変わるのですか? 値やエンコーディングは変更していません。保存時の動作は、MS-DOS または通常の .csv 形式と同じです。また、テストではExcelを使用してコピー/開く/保存しています。
使用する必要があるエンコーディングまたはフォーマット設定はありますか? これをプログラムで解決できますか?
前もって感謝します!
編集#1:
追加のコンテキストとして、元のファイルで最初に空の行を表示すると、次のような改行 ^M 文字が含まれています。
^M
Excel で開いて保存すると、37 個の空のフィールドがすべて次のようになります。
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^M
これは Windows エンコーディングの不一致ですか?