I would like to parse a Google eBook transaction report. I opened it in Notepad++ to see precisely the filed and record delimiters. It is a tab delimited file, every header field and data field are surrounded by quotation marks. The first two lines of the CSV file are:
"Transaction Date" "Id" "Product" "Type" "Preorder" "Qty" "Primary ISBN" "Imprint Name" "Title" "Author" "Original List Price Currency" "Original List Price" "List Price Currency" "List Price [tax inclusive]" "List Price [tax exclusive]" "Country of Sale" "Publisher Revenue %" "Publisher Revenue" "Payment Currency" "Payment Amount" "Currency Conversion Rate" "2016. 09. 01." "ID:1166315449551685" "Single Purchase" "Sale" "None" "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" "" "" ""
I use the following code to parse the CSV file:
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;
};
When I debug the parsing proccess than I can see that record.get("Author") threw runtime exception:
java.lang.IllegalArgumentException: Mapping for Author not found, expected one of [��"
Obviously I have column named Author. Any ide what goes wrong?
.parse(in, StandardCharsets.UTF_8)- tonakai