Google eBook のトランザクション レポートを解析したいと考えています。ファイルとレコードの区切り文字を正確に確認するために、メモ帳++で開きました。これはタブ区切りのファイルで、すべてのヘッダー フィールドとデータ フィールドは引用符で囲まれています。CSV ファイルの最初の 2 行は次のとおりです。
"Transaction Date" "Id" "Product" "Type" "Preorder" "Qty" "Primary ISBN" "Imprint Name" "Title" "Author" "Original List Price Currency" "Original List Price Currency" "Original List Price Currency" "定価[税込]」「定価[税抜]」「販売国」「発行者収益%」「発行者収益」「支払通貨」「支払金額」「通貨換算率」 「2016.09.01.」"ID:1166315449551685" "単品購入" "セール" "なし" "1" "9789633780664" "Book and Walk Kft" "Bánk bán" "József Katona" "HUF" "0,00" "HUF" "0,00 " "0,00" "HU" "52,0%" "0,00" "" "" ""
次のコードを使用して、CSV ファイルを解析します。
private List<Sales> parseCsv(File csv) {
Calendar max = Calendar.getInstance();
Calendar current = Calendar.getInstance();
boolean firstRound = true;
List<Sales> sales = new ArrayList<>();
Sales currentRecord;
Reader in;
try {
in = new FileReader(csv);
Iterable<CSVRecord> records;
try {
records = CSVFormat.TDF.withQuote('\"').withFirstRecordAsHeader().parse(in);
for (CSVRecord record : records) {
currentRecord = new Sales();
currentRecord.setAuthor(record.get("Author"));
currentRecord.setTitle(record.get("Title"));
currentRecord.setPublisher(record.get("Imprint Name"));
currentRecord.setIsbn(record.get("Primary ISBN"));
currentRecord.setChannel("Google");
currentRecord.setBookId(record.get("Id"));
currentRecord.setCountry(record.get("Country of Sale"));
currentRecord.setUnits(Integer.parseInt(record.get("Qty")));
currentRecord.setUnitPrice(Float.parseFloat(record.get("List Price [tax exclusive]")));
Date transDate;
try {
transDate = sourceDateFormat.parse(record.get("Transaction Date"));
if (firstRound) {
max.setTime(transDate);
};
current.setTime(transDate);
if (current.after(max)) {
max.setTime(current.getTime());
}
currentRecord.setDatum(transDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
LOG.log(Level.SEVERE,"Nem megfeelő formátumú a dátum a {0} file-ban",csv.getAbsolutePath());
}
currentRecord.setCurrencyCustomer(record.get("List Price Currency"));
currentRecord.setCurrencyProceeds(record.get("Payment Amount"));
currentRecord.setCurrencyProceeds(record.get("Payment Currency"));
sales.add(currentRecord);
}
LOG.log(Level.INFO, "Daily sales transactions of {0} were successfully parsed from ",
csv.getAbsolutePath());
return sales;
} catch (IOException e1) {
// TODO Auto-generated catch block
LOG.log(Level.SEVERE, "Valami nem stimmel a {0} file szerkezetével",csv.getAbsolutePath());
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
LOG.log(Level.SEVERE,"A {0} file-t nem találom.",csv.getAbsolutePath());
}
return null;
};
解析プロセスをデバッグすると、record.get("Author") が実行時例外をスローしたことがわかります。
java.lang.IllegalArgumentException: Mapping for Author not found, expected one of [��"
明らかに、Author という名前の列があります。何がうまくいかないのですか?