All Versions
Latest Version
Avg Release Cycle
83 days
Latest Release
1298 days ago

Changelog History

  • v2.9.0 Changes

    August 15, 2020

    ๐Ÿ› BUGs fixed

    ๐Ÿ“œ CSV auto-detection assigning line ending as quote escape (#409)

    ๐Ÿ›  FixedWidthFields.keepPadding not working (#405)

    ๐Ÿ“œ Multi-char delimiter incorrectly detected inside quoted string (#404)

    ๐Ÿ›  Fixed the repeatable conversions initialization in the DefaultConversionProcessor (#399)

    ๐Ÿ›  Fix NPE in EnumConversion (#391)

    ๐Ÿ›  fixed quoted parser when using non-printable char as delimiter (#378)

    โœจ Enhancements

    ๐Ÿ”ง make the maxRowSample for parameter public configurable for CSV auto-detection (#408)

    ๐Ÿ“œ settings.excludeFields() doesn't throw errors for a non-existing fields anymore. (#383)

    ๐Ÿ”ฆ Expose InputAnalysisProcess implementations publicly (#381)

    โž• add "com.googlecode.openbeans" as an optional OSGi dependency (#411)

  • v2.8.4 Changes

    December 09, 2019

    ๐Ÿ› BUGS FIXED:

    ๐Ÿ“œ Value which contains line separator is NOT enclosed in quotes if line separator is 2 characters (#357)

    ๐Ÿ“œ Headers in Record context are changed if parser instance is reused (#350)

    ๐Ÿ“œ Record.getString(column) fails if type of column is declared as int and content in file is null (#355)


    • ๐Ÿ“œ Rows starting with comment char should be automatically quoted (#362)
  • v2.8.3 Changes

    August 08, 2019

    ๐Ÿ› BUGS:

    ๐Ÿ“œ #345 parseLine() is throwing ClassCastException when using lookahead

    ๐Ÿ“œ #337 Inconsistent parsing behavior when max. characters per column is set to -1 (unlimited)

    ๐Ÿ“œ #343 FixedWidthParser drops first char of next record if last field of current record is empty

    ๐Ÿ“œ #336 Single column, empty row CSV files result in empty rows and truncation of the last row

    ๐Ÿ“œ #328 Auto detect format with upper and lower thom is not working

    ๐Ÿ›  fixed issue writing rows with selection of fields where the number of columns is larger than the selected/available fields.


    On CSV format auto-detection, use order of allowed delimiters as order of preference

    ๐ŸŽ Performance improvement parsing values when maxCharsPerColumn = -1 (i.e. unlimited)

    โž• added support for writing instances of Record directly.

  • v2.8.2 Changes

    May 14, 2019

    ๐Ÿ› BUGS:

    ๐Ÿ“œ Headers being extracted when not expected, and this is leading to memory leak #326

    ๐Ÿ“œ Unclear iteractions between iterate() methods and context/header parsing #314

    ๐Ÿ“œ containsColumn throws ArrayIndexOutOfBoundsException, in combination with selectFields #316

    ๐Ÿ“œ The result of the method getRecordNumber in TextParsingException is wrong. #324


    ๐Ÿ“œ On CSV format auto-detection, resolve space as column separator #310

    โšก๏ธ Updated default excel serialization settings to ALWAYS escape either \r or \n as \r\n. #315

  • v2.8.1 Changes

    February 06, 2019

    ๐Ÿš€ This release fixes bug reported in issue #309 - headers parsed from one input are used again when another input is parsed using the same parser instance.

  • v2.8.0 Changes

    February 01, 2019

    โœจ 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("", 0); 
        // use methods too. This assumes Contact has a `fullName(java.lang.String)` setter method:
        mapper.methodToColumnName("", 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("", "client_name");

    You can also just give it a map:

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

    โœ… Contrived unit tests:

    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

  • v2.7.6 Changes

    September 25, 2018

    โœจ Enhancements:

    • ๐Ÿ‘ allowing users to subclass ValidatedConversion
    • ๐Ÿ‘ better handling of InvocationTargetExceptions when dealing with errors thrown from getters/setters

    ๐Ÿ›  Bugfixes:

    • custom validations weren't working when writing
    • ๐Ÿ“œ CSV autodetection failed in some cases (issue #272)
  • v2.7.5

    August 06, 2018
  • v2.7.4

    August 06, 2018
  • v2.7.3 Changes

    August 02, 2018

    โœจ Enhancements:

    ๐ŸŽ Performance improvements skipping values of de-selected fields with the CSV parser.

    โž• Adding support for regex validation and custom validations on class attributes and methods annotated with @Validate

    ๐Ÿ›  Bugfixes:

    ๐Ÿ“œ CsvRoutines.getInputDimension() returns one row less rowCount regardless of csvParserSettings.setHeaderExtractionEnabled() #262

    ๐Ÿ“œ record.toFieldMap() not working on FixedWidth #258