32
32
import java .io .FileReader ;
33
33
import java .io .IOException ;
34
34
import java .io .ObjectInputStream ;
35
- import java .io .Reader ;
36
35
import java .util .HashMap ;
36
+ import java .util .Iterator ;
37
37
import java .util .Map ;
38
38
import java .util .concurrent .locks .ReentrantReadWriteLock .WriteLock ;
39
39
40
- import org .apache .commons .csv .CSVFormat ;
41
- import org .apache .commons .csv .CSVParser ;
42
- import org .apache .commons .csv .CSVRecord ;
43
40
import org .mastodon .RefPool ;
44
41
import org .mastodon .collection .RefCollection ;
45
42
import org .mastodon .feature .Dimension ;
60
57
import org .scijava .plugin .Plugin ;
61
58
import org .scijava .util .VersionUtils ;
62
59
60
+ import com .opencsv .CSVParser ;
61
+ import com .opencsv .CSVParserBuilder ;
62
+ import com .opencsv .CSVReader ;
63
+ import com .opencsv .CSVReaderBuilder ;
64
+
63
65
import net .imglib2 .algorithm .Algorithm ;
64
66
65
67
public class CSVImporter implements Algorithm
@@ -137,32 +139,36 @@ public static Builder create()
137
139
@ Override
138
140
public boolean checkInput ()
139
141
{
140
- final CSVFormat csvFormat = CSVFormat .EXCEL
141
- .builder ()
142
- .setHeader ()
143
- .setCommentMarker ( '#' )
144
- .build ();
145
- try (Reader in = new FileReader ( filePath );
146
- CSVParser records = csvFormat .parse ( in );)
142
+ if ( separator == '\0' )
147
143
{
148
- final Map < String , Integer > headerMap = records .getHeaderMap ();
149
- if ( null == headerMap )
144
+ try
150
145
{
151
- errorMessage = "File " + filePath + " does not have a header.\n " ;
152
- return false ;
146
+ separator = AutoDetectCSVSeparator .autoDetect ( filePath );
147
+ }
148
+ catch ( final IOException e1 )
149
+ {
150
+ separator = ',' ;
153
151
}
154
-
155
152
}
156
- catch ( final FileNotFoundException e )
153
+
154
+ final CSVParser parser =
155
+ new CSVParserBuilder ()
156
+ .withSeparator ( separator )
157
+ .withIgnoreQuotations ( true )
158
+ .build ();
159
+ try
157
160
{
158
- errorMessage = "Could not find file " + filePath + "\n " + e .getMessage ();
159
- return false ;
161
+ new CSVReaderBuilder ( new FileReader ( filePath ) )
162
+ .withCSVParser ( parser )
163
+ .build ();
160
164
}
161
- catch ( final IOException e )
165
+ catch ( final FileNotFoundException e )
162
166
{
163
- errorMessage = "Error reading file " + filePath + "\n " + e .getMessage ();
167
+ errorMessage = "Could not find file: " + filePath ;
168
+ e .printStackTrace ();
164
169
return false ;
165
170
}
171
+
166
172
return true ;
167
173
}
168
174
@@ -185,24 +191,34 @@ public boolean process()
185
191
}
186
192
}
187
193
188
- final CSVFormat csvFormat = CSVFormat .EXCEL
189
- .builder ()
190
- .setDelimiter ( separator )
191
- .setHeader ()
192
- .setCommentMarker ( '#' )
193
- .build ();
194
-
195
- try (Reader in = new FileReader ( filePath );
196
- CSVParser records = csvFormat .parse ( in );)
194
+ final CSVParser parser =
195
+ new CSVParserBuilder ()
196
+ .withSeparator ( separator )
197
+ .withIgnoreQuotations ( true )
198
+ .build ();
199
+ try
197
200
{
201
+ final CSVReader reader = new CSVReaderBuilder ( new FileReader ( filePath ) )
202
+ .withCSVParser ( parser )
203
+ .build ();
204
+ final Iterator < String [] > it = reader .iterator ();
205
+
206
+ /*
207
+ * Parse first line and reads it as the header of the file.
208
+ */
209
+
210
+ if ( !it .hasNext () )
211
+ {
212
+ errorMessage = "CSV file is empty." ;
213
+ return false ;
214
+ }
198
215
199
- final Map < String , Integer > uncleanHeaderMap = records . getHeaderMap ();
200
- final Map < String , Integer > headerMap = new HashMap <>( uncleanHeaderMap . size () );
201
- for ( final String uncleanKey : uncleanHeaderMap . keySet () )
216
+ final String [] firstLine = it . next ();
217
+ final Map < String , Integer > headerMap = new HashMap <>( firstLine . length );
218
+ for ( int i = 0 ; i < firstLine . length ; i ++ )
202
219
{
203
- // Remove control and invisible chars.
204
- final String cleanKey = uncleanKey .trim ().replaceAll ( "\\ p{C}" , "" );
205
- headerMap .put ( cleanKey , uncleanHeaderMap .get ( uncleanKey ) );
220
+ final String cleanKey = firstLine [ i ].trim ().replaceAll ( "\\ p{C}" , "" );
221
+ headerMap .put ( cleanKey , Integer .valueOf ( i ) );
206
222
}
207
223
208
224
/*
@@ -264,50 +280,55 @@ public boolean process()
264
280
labelcol = headerMap .get ( labelColumnName );
265
281
266
282
/*
267
- * Iterate over records .
283
+ * Iterate over the rest of lines .
268
284
*/
269
285
270
286
final WriteLock lock = graph .getLock ().writeLock ();
271
287
lock .lock ();
272
288
final Spot vref = graph .vertexRef ();
273
289
final double [] pos = new double [ 3 ];
290
+
274
291
try
275
292
{
276
- for ( final CSVRecord record : records )
293
+ int lineNumber = 1 ;
294
+ while ( it .hasNext () )
277
295
{
296
+ final String [] record = it .next ();
297
+ lineNumber ++;
298
+
278
299
try
279
300
{
280
- pos [ 0 ] = Double .parseDouble ( record . get ( xcol ) ) + xOrigin ;
281
- pos [ 1 ] = Double .parseDouble ( record . get ( ycol ) ) + yOrigin ;
282
- pos [ 2 ] = Double .parseDouble ( record . get ( zcol ) ) + zOrigin ;
283
- final int t = Integer .parseInt ( record . get ( framecol ) );
301
+ pos [ 0 ] = Double .parseDouble ( record [ xcol ] ) + xOrigin ;
302
+ pos [ 1 ] = Double .parseDouble ( record [ ycol ] ) + yOrigin ;
303
+ pos [ 2 ] = Double .parseDouble ( record [ zcol ] ) + zOrigin ;
304
+ final int t = Integer .parseInt ( record [ framecol ] );
284
305
285
306
final Spot spot = graph .addVertex ( vref ).init ( t , pos , radius );
286
307
if ( null != idcol )
287
308
{
288
- final int id = Integer .parseInt ( record . get ( idcol ) );
309
+ final int id = Integer .parseInt ( record [ idcol ] );
289
310
originalIdFeature .set ( spot , id );
290
311
if ( null == labelcol )
291
312
spot .setLabel ( "" + id );
292
313
}
314
+
293
315
if ( null != labelcol )
294
316
{
295
- spot .setLabel ( record . get ( labelcol ) );
317
+ spot .setLabel ( record [ labelcol ] );
296
318
}
297
319
double q = 1. ;
298
320
if ( null != qualitycol )
299
321
{
300
- q = Double .parseDouble ( record . get ( qualitycol ) );
322
+ q = Double .parseDouble ( record [ qualitycol ] );
301
323
qualityFeature .set ( spot , q );
302
324
}
303
325
}
304
326
catch ( final NumberFormatException nfe )
305
327
{
306
328
nfe .printStackTrace ();
307
- System .out .println ( "Could not parse line " + record . getRecordNumber () + ". Malformed number, skipping.\n " + nfe .getMessage () );
329
+ System .out .println ( "Could not parse line " + lineNumber + ". Malformed number, skipping.\n " + nfe .getMessage () );
308
330
continue ;
309
331
}
310
-
311
332
}
312
333
}
313
334
finally
@@ -318,14 +339,8 @@ public boolean process()
318
339
}
319
340
catch ( final FileNotFoundException e )
320
341
{
342
+ errorMessage = "Cannot find file " + filePath ;
321
343
e .printStackTrace ();
322
- errorMessage = e .getMessage ();
323
- return false ;
324
- }
325
- catch ( final IOException e )
326
- {
327
- e .printStackTrace ();
328
- errorMessage = e .getMessage ();
329
344
return false ;
330
345
}
331
346
0 commit comments