16
16
17
17
package org .radarcns .util ;
18
18
19
+ import com .fasterxml .jackson .databind .MappingIterator ;
20
+ import com .fasterxml .jackson .databind .ObjectReader ;
19
21
import com .fasterxml .jackson .databind .ObjectWriter ;
20
22
import com .fasterxml .jackson .dataformat .csv .CsvFactory ;
21
23
import com .fasterxml .jackson .dataformat .csv .CsvGenerator ;
28
30
import org .apache .avro .generic .GenericRecord ;
29
31
30
32
import java .io .IOException ;
33
+ import java .io .Reader ;
31
34
import java .io .Writer ;
32
35
import java .nio .ByteBuffer ;
33
- import java .util .Iterator ;
34
36
import java .util .LinkedHashMap ;
35
37
import java .util .List ;
36
38
import java .util .Map ;
@@ -46,8 +48,8 @@ public static RecordConverterFactory getFactory() {
46
48
CsvFactory factory = new CsvFactory ();
47
49
return new RecordConverterFactory () {
48
50
@ Override
49
- public RecordConverter converterFor (Writer writer , GenericRecord record , boolean writeHeader ) throws IOException {
50
- return new CsvAvroConverter (factory , writer , record , writeHeader );
51
+ public RecordConverter converterFor (Writer writer , GenericRecord record , boolean writeHeader , Reader reader ) throws IOException {
52
+ return new CsvAvroConverter (factory , writer , record , writeHeader , reader );
51
53
}
52
54
53
55
@ Override
@@ -62,21 +64,37 @@ public boolean hasHeader() {
62
64
private final CsvGenerator generator ;
63
65
private final int numOfColumns ;
64
66
65
- public CsvAvroConverter (CsvFactory factory , Writer writer , GenericRecord record , boolean writeHeader )
67
+ public CsvAvroConverter (CsvFactory factory , Writer writer , GenericRecord record , boolean writeHeader , Reader reader )
66
68
throws IOException {
67
69
map = new LinkedHashMap <>();
68
- Map <String , Object > value = convertRecord (record );
70
+
71
+ CsvMapper mapper = new CsvMapper (factory );
72
+ Map <String , Object > value ;
73
+
74
+ CsvSchema schema = CsvSchema .emptySchema ().withHeader ();
75
+ if (!writeHeader ) {
76
+ // If file already exists read the schema from the CSV file
77
+ ObjectReader objectReader = mapper .readerFor (Map .class ).with (schema );
78
+ MappingIterator <Map <String ,Object >> iterator = objectReader .readValues (reader );
79
+ value = iterator .next ();
80
+ } else {
81
+ value = convertRecord (record );
82
+ }
83
+
69
84
CsvSchema .Builder builder = new CsvSchema .Builder ();
70
85
for (String key : value .keySet ()) {
71
86
builder .addColumn (key );
72
87
}
73
- CsvSchema schema = builder .build ();
88
+ schema = builder .build ();
89
+
74
90
if (writeHeader ) {
75
91
schema = schema .withHeader ();
76
92
}
77
- numOfColumns = schema . size ();
93
+
78
94
generator = factory .createGenerator (writer );
79
- csvWriter = new CsvMapper (factory ).writer (schema );
95
+ csvWriter = mapper .writer (schema );
96
+ numOfColumns = schema .size ();
97
+
80
98
}
81
99
82
100
/**
0 commit comments