Skip to content

Next minor release before we move on to version 3.0.0 with JDK 8

Compare
Choose a tag to compare
@jbax jbax released this 01 Feb 03:48
· 95 commits to master since this release

Enhancements:

  • Map column name to attribute #287: This is a big change. Basically you can now skip annotations altogether and manually define mappings from parsed columns to an object, including nested attributes.

Now you can call getColumnMapper() from:

  1. any *Routines class
  2. any *Bean*Processor class (including BeanWriterProcessor) for writing
    mapper.attributeToIndex("name", 0); //name goes to the first column
    mapper.attributeToColumnName("name", "client_name"); .// same thing, but the first column has header "client_name"

Nested classes are also supported, you can do stuff such as the following, where name is buried in an object structure (assume a class Purchase with a Buyer attribute, which in turn has a Contact attribute, where the name is located:

    mapper.methodToIndex("buyer.contact.name", 0); 
   
    // use methods too. This assumes Contact has a `fullName(java.lang.String)` setter method:
    mapper.methodToColumnName("buyer.contact.fullName", String.class, "client_name");

    // this maps getter and setter methods named `fullName` to column `client_name`. The getters or setters are used depending if you are writing to a file or reading from it.
    mapper.methodToColumnName("buyer.contact.fullName", "client_name");

You can also just give it a map:

    Map<String, Integer> mappings = new HashMap<String, Integer>();
    ... fill your map
    mapper.attributesToIndexes(mappings);

Contrived unit tests: https://github.com/uniVocity/univocity-parsers/blob/master/src/test/java/com/univocity/parsers/issues/github/Github_287.java

Other enhancements:

  • Support CSV delimiters of more than one character #209: instead of using one character, delimiters now can be anything (e.g: ##, :-p etc).

  • Support creation of immutable objects #280: create instances of java beans with private constructors and no setter methods.

  • Enable case-sensitive column header matching #283: You can now target files with columns such as 'A', 'a', ' A ' and ' a '. Any existing code should not be affected. For example: if you use parserSettings.selectFields("a") and the parsed header is ' A ', then ' A ' will be selected as usual. This update allows one to use parserSettings.selectFields(" A ", "a") when headers such as ' A ' and 'a' are present (you can go wild here and target many different columns named aaa with different number of surrounding spaces or different character case combinations).

  • CsvParser beginParsing closes the stream #303: Introduced flag to prevent the parser from automatically closing the input: parserSettings.setAutoClosingEnabled(false)

  • Add option on FixedWidthParserSettings to keep padding of parsed values #276: the @FixedWidth annotation now has a keepPading property. This can also be set on the FixedWidthFields, using methods keepPadingOn(columns) and stripPaddingFrom(columns).

  • Introduce UnescapedQuoteHandling.BACK_TO_DELIMITER #259: if an unescaped quote is detected, the parser will re-process the parsed value and split the unescaped value into individual values after each delimiter found.

Bugfixes:

  • An extra row with null returned #306

  • Cannot determine column separator #305

  • Wrong line ending detection when normalizeLineEndingsWithinQuotes = false #299

  • Column selection makes @Validate annotation misbehave #296

  • Fixed width parsing with look-ahead and non-contiguous field definitions #294

  • CsvParser.parse ignores headers parser setting in processStarted Processor's method #289