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 isnull
(#355)✨ ENHANCEMENTS:
- 📜 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.
✨ ENHANCEMENTS:
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
inTextParsingException
is wrong. #324✨ ENHANCEMENTS:
📜 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:- any
*Routines
class any
*Bean*Processor
class (includingBeanWriterProcessor
) for writingmapper.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 useparserSettings.selectFields("a")
and the parsed header is' A '
, then' A '
will be selected as usual. This update allows one to useparserSettings.selectFields(" A ", "a")
when headers such as' A '
and'a'
are present (you can go wild here and target many different columns namedaaa
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 akeepPading
property. This can also be set on theFixedWidthFields
, using methodskeepPadingOn(columns)
andstripPaddingFrom(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
ignoresheaders
parser setting inprocessStarted
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)
- 👍 allowing users to subclass
-
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