Columbus V900/V990 CSV Stream Fixer
Convert and fix Columbus V900 & V990 GPS logger CSV files. Parses coordinates, timestamps, speed, heading, and altitude into clean JSON or fixed CSV.
About
Columbus V900 and V990 GPS data loggers export track data in a non-standard CSV format. Coordinates are encoded in DDMM.MMMM notation rather than decimal degrees. Timestamps are split across two columns (DATE as YYMMDD, TIME as HHMMSS) with no ISO 8601 compliance. Importing this raw data into GIS software, mapping APIs, or analysis pipelines without conversion produces incorrect positions and broken time series. A latitude value of 4547.4659 in the raw file actually represents 45.791098ยฐ decimal. This tool parses the proprietary CSV structure, converts coordinates to standard decimal degrees with correct hemisphere sign from the N/S and E/W flag columns, merges date and time into Unix millisecond timestamps and ISO 8601 strings, and outputs clean JSON objects or corrected CSV. It handles both V900 (basic: INDEX, TAG, DATE, TIME, LAT, N/S, LON, E/W, HEIGHT, SPEED, HEADING, VOX) and V990 extended format (adds FIX MODE, VALID, PDOP, HDOP, VDOP, DISTANCE columns).
Limitations: the tool assumes the device clock was set correctly. GPS altitude (HEIGHT) is ellipsoidal height, not orthometric. Accuracy degrades in the raw data itself under poor satellite geometry (high PDOP values on V990). The parser tolerates minor formatting inconsistencies (trailing commas, BOM bytes, mixed line endings) but expects the standard Columbus header row to be present in the file.
Formulas
The core conversion transforms DDMM.MMMM notation into standard decimal degrees. Given a raw latitude value Lraw in DDMM.MMMM format:
If the hemisphere flag is S (south) or W (west), the result is negated:
Timestamp construction merges DATE (YYMMDD) and TIME (HHMMSS):
month = parseInt(DATE[2:4]) โ 1
day = parseInt(DATE[4:6])
time = Date.UTC(year, month, day, HH, MM, SS)
Where time is the Unix timestamp in milliseconds, and isoTime is its ISO 8601 representation without timezone suffix (matching device-local assumption). The same longitude formula applies with DDDMM.MMMM (three degree digits instead of two), handled identically by the floor division.
Reference Data
| Field | V900 | V990 | Raw Format | Fixed Output | Unit |
|---|---|---|---|---|---|
| INDEX | ✓ | ✓ | Integer | Integer | - |
| TAG | ✓ | ✓ | Single char (T/G/V/C) | Single char | - |
| DATE | ✓ | ✓ | YYMMDD (e.g. 120905) | Merged into time & isoTime | - |
| TIME | ✓ | ✓ | HHMMSS (e.g. 092753) | Merged into time & isoTime | - |
| LATITUDE | ✓ | ✓ | DDMM.MMMM (e.g. 4547.4659) | Decimal degrees (e.g. 45.791098) | ยฐ |
| N/S | ✓ | ✓ | N or S | Sign applied to latitude | - |
| LONGITUDE | ✓ | ✓ | DDDMM.MMMM (e.g. 01101.0754) | Decimal degrees (e.g. 11.017924) | ยฐ |
| E/W | ✓ | ✓ | E or W | Sign applied to longitude | - |
| HEIGHT | ✓ | ✓ | Integer | Integer | m |
| SPEED | ✓ | ✓ | Integer | Integer | km/h |
| HEADING | ✓ | ✓ | Integer (0 - 360) | Integer | ยฐ |
| VOX | ✓ | ✓ | Integer or filename | Integer or string | - |
| FIX MODE | ✗ | ✓ | 2D/3D/DGPS | String | - |
| VALID | ✗ | ✓ | SPS/DGPS/EST | String | - |
| PDOP | ✗ | ✓ | Float | Float | - |
| HDOP | ✗ | ✓ | Float | Float | - |
| VDOP | ✗ | ✓ | Float | Float | - |
| DISTANCE | ✗ | ✓ | Float | Float | m |
| Tag values: T = Trackpoint, G = Waypoint (button press), V = Voice memo, C = POI | |||||