package de.fub.agg2graph.gpseval.data.file; import au.com.bytecode.opencsv.CSVReader; import de.fub.agg2graph.gpseval.data.Waypoint; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; /** * MyTracksCSVFile reads GPS-data from a CSV-file exported by the Android-app * MyTracks. * * <p> * The first four lines of the file are skipped because they contain additional * information. * </p> * * <p> * The following lines contain comma-separated values enclosed by quotes. They * have the format: segments, number, latitude, longitude, height, bearing, * precision, speed, time, ununsed, ununsed, ununsed, ununsed. * </p> */ public class MyTracksCSVFile extends TrackFile { @Override protected Iterator<Waypoint> rawIterator() { return new GPSDataIterator(); } /** * Read CSV-file and return {@link de.fub.agg2graph.gpseval.data.Waypoint * Waypoint}-objects for each data-line. */ private class GPSDataIterator implements Iterator<Waypoint> { private CSVReader mReader; private Waypoint mNextGpsData = null; public GPSDataIterator() { try { mReader = new CSVReader( new FileReader(getDataFile().toString()), ',', '"', 4); } catch (FileNotFoundException ex) { Logger.getLogger(MyTracksCSVFile.class.getName()).log( Level.SEVERE, null, ex); } } @Override public boolean hasNext() { mNextGpsData = null; try { String[] data = mReader.readNext(); if (data != null) { mNextGpsData = new Waypoint(data); return true; } return false; } catch (IOException ex) { Logger.getLogger(MyTracksCSVFile.class.getName()).log( Level.SEVERE, null, ex); return false; } } @Override public void remove() { throw new UnsupportedOperationException("Not supported."); } @Override public Waypoint next() { return mNextGpsData; } } }