|
17 | 17 | package org.metafacture.csv; |
18 | 18 |
|
19 | 19 | import org.metafacture.framework.FluxCommand; |
| 20 | +import org.metafacture.framework.MetafactureException; |
20 | 21 | import org.metafacture.framework.StreamReceiver; |
21 | 22 | import org.metafacture.framework.annotations.Description; |
22 | 23 | import org.metafacture.framework.annotations.In; |
|
31 | 32 |
|
32 | 33 | import java.io.IOException; |
33 | 34 | import java.io.StringReader; |
34 | | -import java.util.List; |
35 | 35 |
|
36 | 36 | /** |
37 | 37 | * Decodes lines of CSV files. First line may be interpreted as header. |
@@ -91,50 +91,51 @@ private void initializeCsvParser() { |
91 | 91 | @Override |
92 | 92 | public void process(final String string) { |
93 | 93 | assert !isClosed(); |
94 | | - final String[] parts = parseCsv(string); |
95 | | - if (hasHeader) { |
96 | | - if (header.length == 0) { |
97 | | - header = parts; |
98 | | - } |
99 | | - else if (parts.length == header.length) { |
100 | | - getReceiver().startRecord(String.valueOf(++count)); |
101 | | - for (int i = 0; i < parts.length; ++i) { |
102 | | - getReceiver().literal(header[i], parts[i]); |
| 94 | + try ( |
| 95 | + StringReader sr = new StringReader(string); |
| 96 | + CSVReader reader = new CSVReaderBuilder(sr).withCSVParser(parser).build() |
| 97 | + ) { |
| 98 | + String[] parts; |
| 99 | + while ((parts = parseCsv(reader)) != null) { |
| 100 | + if (hasHeader) { |
| 101 | + if (header.length == 0) { |
| 102 | + header = parts; |
| 103 | + } |
| 104 | + else if (parts.length == header.length) { |
| 105 | + getReceiver().startRecord(String.valueOf(++count)); |
| 106 | + for (int i = 0; i < parts.length; ++i) { |
| 107 | + getReceiver().literal(header[i], parts[i]); |
| 108 | + } |
| 109 | + getReceiver().endRecord(); |
| 110 | + } |
| 111 | + else { |
| 112 | + throw new IllegalArgumentException( |
| 113 | + String.format( |
| 114 | + "wrong number of columns (expected %s, was %s) in input line: %s", |
| 115 | + header.length, parts.length, string)); |
| 116 | + } |
| 117 | + } |
| 118 | + else { |
| 119 | + getReceiver().startRecord(String.valueOf(++count)); |
| 120 | + for (int i = 0; i < parts.length; ++i) { |
| 121 | + getReceiver().literal(String.valueOf(i), parts[i]); |
| 122 | + } |
| 123 | + getReceiver().endRecord(); |
103 | 124 | } |
104 | | - getReceiver().endRecord(); |
105 | | - } |
106 | | - else { |
107 | | - throw new IllegalArgumentException( |
108 | | - String.format( |
109 | | - "wrong number of columns (expected %s, was %s) in input line: %s", |
110 | | - header.length, parts.length, string)); |
111 | 125 | } |
112 | 126 | } |
113 | | - else { |
114 | | - getReceiver().startRecord(String.valueOf(++count)); |
115 | | - for (int i = 0; i < parts.length; ++i) { |
116 | | - getReceiver().literal(String.valueOf(i), parts[i]); |
117 | | - } |
118 | | - getReceiver().endRecord(); |
| 127 | + catch (final IOException e) { |
| 128 | + throw new MetafactureException(e); |
119 | 129 | } |
120 | 130 | } |
121 | 131 |
|
122 | | - private String[] parseCsv(final String csv) { |
123 | | - String[] parts = new String[0]; |
| 132 | + private String[] parseCsv(final CSVReader reader) { |
124 | 133 | try { |
125 | | - final CSVReader reader = new CSVReaderBuilder(new StringReader(csv)) |
126 | | - .withCSVParser(parser) |
127 | | - .build(); |
128 | | - final List<String[]> lines = reader.readAll(); |
129 | | - if (lines.size() > 0) { |
130 | | - parts = lines.get(0); |
131 | | - } |
132 | | - reader.close(); |
| 134 | + return reader.readNext(); |
133 | 135 | } |
134 | 136 | catch (final IOException | CsvException e) { |
135 | | - e.printStackTrace(); |
| 137 | + throw new MetafactureException(e); |
136 | 138 | } |
137 | | - return parts; |
138 | 139 | } |
139 | 140 |
|
140 | 141 | /** |
|
0 commit comments