Thanks for this great library! It's very flexible so I continue to come back to it.
I'm currently using 1.6.0-SNAPSHOT, and I've encountered an issue when using the setHeaders / selectFields.
I have a test bean like this (in Scala):
@BeanInfo
@Headers(sequence = Array(
"id", "timestamp", "symbol", "quantity", "isComplete", "datetime", "number"
))
class BasicTypes() extends ToJsonString {
@Parsed var id: Int = _
@Parsed var quantity: Double = _
@Parsed var timestamp: Long = _
@Parsed var symbol: String = _
@Parsed var isComplete: Boolean = _
@Parsed var number: Numerals = _
@Parsed
@Convert(conversionClass = classOf[DateOptTimeConversion])
var datetime: DateTime = _
override def toString: String = toJsonString
}
And my writer is like this:
def writeCsv[T: Manifest](
records: Seq[T], writer: Writer, headers: Option[Seq[String]] = None)
(implicit tag: ClassTag[T]): Unit = {
val cls = tag.runtimeClass.asInstanceOf[Class[T]]
val processor = new BeanWriterProcessor[T](cls)
val settings = new CsvWriterSettings
settings.setRowWriterProcessor(processor)
headers.foreach { h =>
println("XXX=", h)
//settings.setHeaders(h: _*)
//settings.setHeaders("id")
//settings.selectFields("timestamp")
}
val w = new CsvWriter(writer, settings)
w.writeHeaders()
w.processRecordsAndClose(records.asJava)
}
If I don't override the setHeaders and selectFields, then it works.
If I selective pick fields in a different order (e.g., quantity, symbol, number), then I would get an error.
Calling settings.selectFields("id") works:
id,timestamp,symbol,quantity,isComplete,datetime,number
1,,,,,,
9,,,,,,
100,,,,,,
Calling settings.selectFields("timestamp") doesn't work:
[info] com.univocity.parsers.common.DataProcessingException: Error processing data conversions
[info] Internal state when error was thrown: charIndex=0, row=[null], columnIndex=0
[info] at com.univocity.parsers.common.ConversionProcessor.handleConversionError(ConversionProcessor.java:206)
[info] at com.univocity.parsers.common.ConversionProcessor.reverseConversions(ConversionProcessor.java:192)
[info] at com.univocity.parsers.common.processor.BeanConversionProcessor.reverseConversions(BeanConversionProcessor.java:373)
[info] at com.univocity.parsers.common.processor.BeanWriterProcessor.write(BeanWriterProcessor.java:57)
[info] at com.univocity.parsers.common.AbstractWriter.processRecord(AbstractWriter.java:390)
[info] at com.univocity.parsers.common.AbstractWriter.processRecords(AbstractWriter.java:345)
[info] at com.univocity.parsers.common.AbstractWriter.processRecordsAndClose(AbstractWriter.java:316)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.writeCsv(ScalaCsv.scala:52)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.toCsvStr(ScalaCsv.scala:68)
[info] at com.extrategic.util.csv.univocity.ScalaCsvTest$$anonfun$3.apply$mcV$sp(ScalaCsvTest.scala:55)
[info] ...
[info] Cause: java.lang.ArrayIndexOutOfBoundsException: 1
[info] at com.univocity.parsers.common.ConversionProcessor.reverseConversions(ConversionProcessor.java:188)
[info] at com.univocity.parsers.common.processor.BeanConversionProcessor.reverseConversions(BeanConversionProcessor.java:373)
[info] at com.univocity.parsers.common.processor.BeanWriterProcessor.write(BeanWriterProcessor.java:57)
[info] at com.univocity.parsers.common.AbstractWriter.processRecord(AbstractWriter.java:390)
[info] at com.univocity.parsers.common.AbstractWriter.processRecords(AbstractWriter.java:345)
[info] at com.univocity.parsers.common.AbstractWriter.processRecordsAndClose(AbstractWriter.java:316)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.writeCsv(ScalaCsv.scala:52)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.toCsvStr(ScalaCsv.scala:68)
[info] at com.extrategic.util.csv.univocity.ScalaCsvTest$$anonfun$3.apply$mcV$sp(ScalaCsvTest.scala:55)
Calling setHeaders("id") doesn't work:
[info] java.lang.ArrayIndexOutOfBoundsException: -1
[info] at com.univocity.parsers.common.processor.BeanConversionProcessor.mapFieldIndexes(BeanConversionProcessor.java:244)
[info] at com.univocity.parsers.common.processor.BeanConversionProcessor.mapFieldsToValues(BeanConversionProcessor.java:326)
[info] at com.univocity.parsers.common.processor.BeanConversionProcessor.reverseConversions(BeanConversionProcessor.java:361)
[info] at com.univocity.parsers.common.processor.BeanWriterProcessor.write(BeanWriterProcessor.java:57)
[info] at com.univocity.parsers.common.AbstractWriter.processRecord(AbstractWriter.java:390)
[info] at com.univocity.parsers.common.AbstractWriter.processRecords(AbstractWriter.java:345)
[info] at com.univocity.parsers.common.AbstractWriter.processRecordsAndClose(AbstractWriter.java:316)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.writeCsv(ScalaCsv.scala:52)
[info] at com.extrategic.util.csv.univocity.ScalaCsv$.toCsvStr(ScalaCsv.scala:68)
[info] at com.extrategic.util.csv.univocity.ScalaCsvTest$$anonfun$3.apply$mcV$sp(ScalaCsvTest.scala:55)