summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2010-05-19 20:47:48 -0400
committerEric S. Raymond <esr@thyrsus.com>2010-05-19 20:47:48 -0400
commitfc07400653635c8065adad2edd5bfb3852113e56 (patch)
treebc03a9e0c71c85edcae74ed8351e918574e4d3d1
parentbc8faf61d4387c18b0fdcd029d0afe76926a4856 (diff)
downloadgpsd-fc07400653635c8065adad2edd5bfb3852113e56.tar.gz
Switch the CSV format emitted by gpsdecode(1) to DSV using |.
The problem with CSV is that string fields (such as ship name in type 5) can contain commas. I could have backslash-escaped them, but I think it's better to make old scripts fail in a way that's likely to be noticed than perpetuate a situation in which unescaped commas could cause output to be unpacked wrongly. I changed the Python decoder as well. Required rebuilding one regression test. All regression tests pass.
-rw-r--r--NEWS3
-rwxr-xr-xdevtools/ais.py14
-rw-r--r--gpsdecode.c46
-rw-r--r--gpsdecode.xml15
-rw-r--r--test/sample.aivdm.chk88
5 files changed, 86 insertions, 80 deletions
diff --git a/NEWS b/NEWS
index d3d1e428..5d640bf1 100644
--- a/NEWS
+++ b/NEWS
@@ -14,7 +14,8 @@
option for setting the timestamp format. xgpsspeed is completely
rewritten in Python, eliminating some dependencies on ancient X
libraries. We now ship a Qt binding for the client library. Note
- a GCC 4.2.1 optimizer bug.
+ a GCC 4.2.1 optimizer bug. gpsdcode now uses | as a field separator
+ in -c mode, as string fields can contain commas.
* Tue Apr 20 2010 Eric S. Raymond <esr@snark.thyrsus.com> - 2.94
Error-checking in the 50bps subframe code has been greatly improved.
diff --git a/devtools/ais.py b/devtools/ais.py
index 0a3f2e92..a05700df 100755
--- a/devtools/ais.py
+++ b/devtools/ais.py
@@ -920,11 +920,11 @@ def parse_ais_messages(source, scaled=False, skiperr=False, verbose=0):
for (lc, raw, bits) in packet_scanner(source):
values['length'] = bits.bitlen
# Without the following magic, we'd have a subtle problem near
- # certain variable-length messages: CSV reports would
+ # certain variable-length messages: DSV reports would
# sometimes have fewer fields than expected, because the
# unpacker would never generate cooked tuples for the omitted
# part of the message. Presently a known issue for types 15
- # and 16 only. (Will never affect variable-length messages in
+ # and 16 only. (Would never affect variable-length messages in
# which the last field type is 'string' or 'raw').
bits.extend_to(168)
# Magic recursive unpacking operation
@@ -1001,7 +1001,7 @@ if __name__ == "__main__":
print "ais.py: " + str(msg)
raise SystemExit, 1
- csv = False
+ dsv = False
dump = False
histogram = False
json = False
@@ -1014,7 +1014,7 @@ if __name__ == "__main__":
skiperr = True
for (switch, val) in options:
if switch == '-c':
- csv = True
+ dsv = True
elif switch == '-d':
dump = True
elif switch == '-h':
@@ -1034,7 +1034,7 @@ if __name__ == "__main__":
elif switch == '-x':
skiperr = False
- if not csv and not histogram and not json and not malformed and not quiet:
+ if not dsv and not histogram and not json and not malformed and not quiet:
dump = True
try:
for (raw, parsed, bogon) in parse_ais_messages(sys.stdin, scaled, skiperr, verbose):
@@ -1046,8 +1046,8 @@ if __name__ == "__main__":
if not bogon:
if json:
print "{" + ",".join(map(lambda x: '"' + x[0].name + '":' + str(x[1]), parsed)) + "}"
- elif csv:
- print ",".join(map(lambda x: str(x[1]), parsed))
+ elif dsv:
+ print "|".join(map(lambda x: str(x[1]), parsed))
elif histogram:
frequencies[msgtype] = frequencies.get(msgtype, 0) + 1
elif dump:
diff --git a/gpsdecode.c b/gpsdecode.c
index 08ef0ad6..a9431e08 100644
--- a/gpsdecode.c
+++ b/gpsdecode.c
@@ -45,7 +45,7 @@ void gpsd_report(int errlevel, const char *fmt, ...)
static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
{
- (void)snprintf(buf, buflen, "%u,%u,%09u,", ais->type, ais->repeat,
+ (void)snprintf(buf, buflen, "%u|%u|%09u|", ais->type, ais->repeat,
ais->mmsi);
/*@ -formatcode @*/
switch (ais->type) {
@@ -53,7 +53,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
case 2:
case 3:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%d,%u,%u,%d,%d,%u,%u,%u,0x%x,%u,0x%x",
+ "%u|%d|%u|%u|%d|%d|%u|%u|%u,0x%x|%u,0x%x",
ais->type1.status,
ais->type1.turn,
ais->type1.speed,
@@ -69,7 +69,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
case 4: /* Base Station Report */
case 11: /* UTC/Date Response */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%04u:%02u:%02uT%02u:%02u:%02uZ,%u,%d,%d,%u,%u,0x%x",
+ "%04u:%02u:%02uT%02u:%02u:%02uZ|%u|%d|%d|%u|%u,0x%x",
ais->type4.year,
ais->type4.month,
ais->type4.day,
@@ -84,7 +84,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 5: /* Ship static and voyage related data */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%s,%s,%u,%u,%u,%u,%u,%u,%02u-%02uT%02u:%02uZ,%u,%s,%u",
+ "%u|%u|%s|%s|%u|%u|%u|%u|%u|%u|%02u-%02uT%02u:%02uZ|%u|%s|%u",
ais->type5.imo,
ais->type5.ais_version,
ais->type5.callsign,
@@ -104,7 +104,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 6: /* Binary Message */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%u,%zd:%s",
+ "%u|%u|%u|%u|%u|%zd:%s",
ais->type6.seqno,
ais->type6.dest_mmsi,
(uint) ais->type6.retransmit,
@@ -117,13 +117,13 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
case 7: /* Binary Acknowledge */
case 13: /* Safety Related Acknowledge */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u",
+ "%u|%u|%u|%u",
ais->type7.mmsi1,
ais->type7.mmsi2, ais->type7.mmsi3, ais->type7.mmsi4);
break;
case 8: /* Binary Broadcast Message */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%zd:%s",
+ "%u|%u|%zd:%s",
ais->type8.dac,
ais->type8.fid,
ais->type8.bitcount,
@@ -132,7 +132,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 9:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%d,%d,%u,%u,0x%x,%u,%u,0x%x",
+ "%u|%u|%u|%d|%d|%u|%u,0x%x|%u|%u,0x%x",
ais->type9.alt,
ais->type9.speed,
(uint) ais->type9.accuracy,
@@ -150,7 +150,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 12: /* Safety Related Message */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%s",
+ "%u|%u|%u|%s",
ais->type12.seqno,
ais->type12.dest_mmsi,
(uint) ais->type12.retransmit, ais->type12.text);
@@ -161,7 +161,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 15:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%u,%u,%u,%u",
+ "%u|%u|%u|%u|%u|%u|%u|%u",
ais->type15.mmsi1,
ais->type15.type1_1,
ais->type15.offset1_1,
@@ -172,7 +172,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 16:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%u,%u",
+ "%u|%u|%u|%u|%u|%u",
ais->type16.mmsi1,
ais->type16.offset1,
ais->type16.increment1,
@@ -181,7 +181,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 17:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%d,%d,%zd:%s",
+ "%d|%d|%zd:%s",
ais->type17.lon,
ais->type17.lat,
ais->type17.bitcount,
@@ -190,7 +190,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 18:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%d,%d,%u,%u,%u,0x%x,%u,%u,%u,%u,%u,%u,0x%x",
+ "%u|%u|%u|%d|%d|%u|%u|%u,0x%x|%u|%u|%u|%u|%u|%u,0x%x",
ais->type18.reserved,
ais->type18.speed,
(uint) ais->type18.accuracy,
@@ -209,7 +209,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 19:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%d,%d,%u,%u,%u,0x%x,%s,%u,%u,%u,%u,%u,%u,%u,%u,%u",
+ "%u|%u|%u|%d|%d|%u|%u|%u,0x%x|%s|%u|%u|%u|%u|%u|%u|%u|%u|%u",
ais->type19.reserved,
ais->type19.speed,
(uint) ais->type19.accuracy,
@@ -231,7 +231,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 20: /* Data Link Management Message */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
+ "%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u",
ais->type20.offset1,
ais->type20.number1,
ais->type20.timeout1,
@@ -250,7 +250,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 21: /* Aid to Navigation */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%s,%u,%d,%d,%u,%u,%u,%u,%u,%u,%u,0x%x,%u,%u",
+ "%u|%s|%u|%d|%d|%u|%u|%u|%u|%u|%u|%u,0x%x|%u|%u",
ais->type21.aid_type,
ais->type21.name,
(uint) ais->type21.accuracy,
@@ -270,7 +270,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
case 22: /* Channel Management */
if (!ais->type22.addressed)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%d,%d,%d,%d,%u,%u,%u,%u",
+ "%u|%u|%u|%u|%d|%d|%d|%d|%u|%u|%u|%u",
ais->type22.channel_a,
ais->type22.channel_b,
ais->type22.txrx,
@@ -284,7 +284,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
(uint) ais->type22.band_b, ais->type22.zonesize);
else
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
+ "%u|%u|%u|%u|%u|%u|%u|%u|%u|%u",
ais->type22.channel_a,
ais->type22.channel_b,
ais->type22.txrx,
@@ -297,7 +297,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 23: /* Group Management Command */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%d,%d,%d,%d,%u,%u,%u,%u,%u",
+ "%d|%d|%d|%d|%u|%u|%u|%u|%u",
ais->type23.ne_lon,
ais->type23.ne_lat,
ais->type23.sw_lon,
@@ -313,13 +313,13 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,", ais->type24.shiptype);
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%s,%s,", ais->type24.vendorid, ais->type24.callsign);
+ "%s|%s,", ais->type24.vendorid, ais->type24.callsign);
if (AIS_AUXILIARY_MMSI(ais->mmsi)) {
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u", ais->type24.mothership_mmsi);
} else {
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u",
+ "%u|%u|%u|%u",
ais->type24.dim.to_bow,
ais->type24.dim.to_stern,
ais->type24.dim.to_port,
@@ -328,7 +328,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 25: /* Binary Message, Single Slot */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%zd:%s\r\n",
+ "%u|%u|%u|%u|%zd:%s\r\n",
(uint) ais->type25.addressed,
(uint) ais->type25.structured,
ais->type25.dest_mmsi,
@@ -339,7 +339,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
break;
case 26: /* Binary Message, Multiple Slot */
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "%u,%u,%u,%u,%zd:%s:%u\r\n",
+ "%u|%u|%u|%u|%zd:%s:%u\r\n",
(uint) ais->type26.addressed,
(uint) ais->type26.structured,
ais->type26.dest_mmsi,
diff --git a/gpsdecode.xml b/gpsdecode.xml
index 0c8fd224..4ca21763 100644
--- a/gpsdecode.xml
+++ b/gpsdecode.xml
@@ -81,9 +81,10 @@ lossless.</para>
each each field preceded by a quoted label and colon and the
entire dump line wrapped in curly braces.</para>
-<para>The <option>-c</option> sets the AIS dump format to CSV. Fields
-are dumped in the order they occur in the AIS packet. Numerics are
-not scaled. Strings are unpacked from six-bit to full ASCII</para>
+<para>The <option>-c</option> sets the AIS dump format to separate
+fields with an ASCII pipe symbol. Fields are dumped in the order they
+occur in the AIS packet. Numerics are not scaled. Strings are unpacked
+from six-bit to full ASCII</para>
<para>The <option>-V</option> option directs the program to emit its
version number, then exit.</para>
@@ -95,7 +96,7 @@ mainly of interest to developers.</para>
<refsect1 id='json_ais'><title>AIS DUMP FORMATS</title>
<para>Without the <option>-j</option> option, dump lines are values of AIS
-payload fields, comma-separated, in the order that they occur in the
+payload fields, pipe-separated, in the order that they occur in the
payload. Spans of fields expressing a date are emitted as an ISO8601
timestamp (look for colons and the trailing Z indicating Zulu/UTC
time), and the 19-bit group of TDMA status fields found at the end of
@@ -109,7 +110,7 @@ dump.</para>
performed for the output. Latitudes and longitudes are scaled to
decimal degrees rather than the native AIS unit of 1/10000th of a
minute of arc. Ship (but not air) speeds are scaled to knots rather
-than tenth-of-knot unit. Navigation status and positioning-system
+than tenth-of-knot units. Navigation status and positioning-system
type are dumped as text strings rather than IAS numeric codes. Rate of
turn may appear as "nan" if is unavailable, or as one of the strings
"fastright" or "fastleft" if it is out of the IAS encoding range;
@@ -174,6 +175,10 @@ scaling.</para>
compiler optimizers, notably in GCC 3.x at -O2, into generating bad
code.</para>
+<para>Older version of this utility used comma as a field separator with
+the <option>-c</option> option. This was a mistake, as ship name and
+other string fields can contain commas.</para>
+
</refsect1>
<refsect1 id='see_also'><title>SEE ALSO</title>
<para>
diff --git a/test/sample.aivdm.chk b/test/sample.aivdm.chk
index 72d383f2..6d4689fa 100644
--- a/test/sample.aivdm.chk
+++ b/test/sample.aivdm.chk
@@ -1,44 +1,44 @@
-1,0,371798000,0,-127,123,1,-74037230,29028980,2240,215,33,0x0,0,0x109c2
-1,0,440348000,0,-128,0,0,-42454920,25848090,934,511,13,0x0,0,0x103f4
-2,0,356302000,0,127,139,0,-42975686,24235415,877,91,41,0x0,0,0x1800c
-3,0,563808000,5,0,0,1,-45796520,22146000,2520,352,35,0x0,0,0x0
-4,0,003669702,2007:05:14T19:57:39Z,1,-45811417,22130260,7,0,0x105df
-5,0,351759000,9134270,0,3FOF8,EVER DIADEM,70,225,70,1,31,1,05-15T14:00Z,122,NEW YORK,0
-6,1,150834090,3,313240222,0,669,11,48:eb2f118f7ff1
-6,0,265538450,0,2655651,0,1,40,16:0000
-7,0,002655651,265538450,0,0,0
-7,1,655901842,158483613,321823389,836359488,0
-7,2,537411077,43101326,717096664,76161024,0
-8,0,366999712,366,22,256:3a53dbb7be4a773137f87d7b0445f040dea05d93f593783194ae9b9d9dbe05fb
-8,0,999999999,366,22,256:eb0d4f917a035b2dfca3d4739381735c18ebbe754936f66850037dcacd9538b8
-9,0,111265591,15,0,0,7128960,34667073,0,28,0x0,0,0,0x6015
-10,0,366814480,366832740
-10,0,440882000,366972000
-11,0,304137000,2009:05:22T02:22:40Z,1,-56644610,17045470,1,0,0x0
-12,0,002275200,0,215724000,0,PLEASE REPORT TO JOBOURG TRAFFIC CHANNEL 13
-12,0,351853000,0,316123456,0,GOOD
-12,0,351853000,1,351809000,0,THANX
-12,0,271002099,0,271002111,1,MSG FROM 271002099
-12,1,237032000,3,2391100,1,EP 531 CARS 80 TRACKS 103 MOTO 5 CREW 86
-12,0,636012668,0,413118000,0,NI HAO.CALL TEST
-12,0,211217560,2,211378120,0,GUD PM 2U N HAPI NEW YIR OL D BES FRM AL FUJAIRAH
-13,0,211378120,211217560,0,0,0
-14,0,351809000,RCVD YR TEST MSG
-14,0,237008900,EP228 IX48 FG3 DK7 PL56.
-14,0,311764000,TEST
-15,0,368578000,5158,5,0,0,0,0,0,0
-15,3,003669720,367014320,3,516,5,617,0,0,0
-16,0,002053501,224251000,200,0,0,0,0
-17,0,002734450,17478,35992,376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
-18,0,338087471,0,1,0,-44443279,24410724,796,511,49,0x0,1,0,1,1,1,1,0xe0006
-18,0,338088483,0,0,0,-42486718,25869335,1716,511,20,0x0,1,0,1,1,1,1,0xe0006
-18,0,368161000,0,51,1,-43340309,23688555,349,511,17,0x0,1,0,1,1,0,1,0xe0006
-19,0,367059850,248,87,0,-53286235,17726217,3359,511,46,0x4,CAPT.J.RIMES,70,5,21,4,4,0,0,0,0
-20,3,003669705,2182,5,7,225,0,0,0,0,0,0,0,0,0,0,0,0
-20,0,003160097,47,1,7,250,2250,1,7,1125,856,5,7,1125,0,0,0,0
-21,0,123456789,20,CHINA ROSE MURPHY EXPRESS ALERT,0,-73619155,28752371,5,5,5,5,1,50,165,0x0,0,0
-22,0,003160048,2087,2088,0,0,-44100,27330,-48100,25400,0,0,0,4
-23,0,002268120,1578,30642,1096,30408,6,0,2,9,0
-24,2,338085242,CAPTAIN'S PARADISE,54,ACR1234,WDD7883,8,3,2,1
-5,0,271010059,0,0,TCA2350,HEALTH CONTROL 13,55,6,10,2,2,1,00-00T24:60Z,20,,0
-5,0,271010059,0,0,TCA2350,HEALTH CONTROL 13,55,6,10,2,2,1,00-00T24:60Z,20,,0
+1|0|371798000|0|-127|123|1|-74037230|29028980|2240|215|33,0x0|0,0x109c2
+1|0|440348000|0|-128|0|0|-42454920|25848090|934|511|13,0x0|0,0x103f4
+2|0|356302000|0|127|139|0|-42975686|24235415|877|91|41,0x0|0,0x1800c
+3|0|563808000|5|0|0|1|-45796520|22146000|2520|352|35,0x0|0,0x0
+4|0|003669702|2007:05:14T19:57:39Z|1|-45811417|22130260|7|0,0x105df
+5|0|351759000|9134270|0|3FOF8|EVER DIADEM|70|225|70|1|31|1|05-15T14:00Z|122|NEW YORK|0
+6|1|150834090|3|313240222|0|669|11|48:eb2f118f7ff1
+6|0|265538450|0|2655651|0|1|40|16:0000
+7|0|002655651|265538450|0|0|0
+7|1|655901842|158483613|321823389|836359488|0
+7|2|537411077|43101326|717096664|76161024|0
+8|0|366999712|366|22|256:3a53dbb7be4a773137f87d7b0445f040dea05d93f593783194ae9b9d9dbe05fb
+8|0|999999999|366|22|256:eb0d4f917a035b2dfca3d4739381735c18ebbe754936f66850037dcacd9538b8
+9|0|111265591|15|0|0|7128960|34667073|0|28,0x0|0|0,0x6015
+10|0|366814480|366832740
+10|0|440882000|366972000
+11|0|304137000|2009:05:22T02:22:40Z|1|-56644610|17045470|1|0,0x0
+12|0|002275200|0|215724000|0|PLEASE REPORT TO JOBOURG TRAFFIC CHANNEL 13
+12|0|351853000|0|316123456|0|GOOD
+12|0|351853000|1|351809000|0|THANX
+12|0|271002099|0|271002111|1|MSG FROM 271002099
+12|1|237032000|3|2391100|1|EP 531 CARS 80 TRACKS 103 MOTO 5 CREW 86
+12|0|636012668|0|413118000|0|NI HAO.CALL TEST
+12|0|211217560|2|211378120|0|GUD PM 2U N HAPI NEW YIR OL D BES FRM AL FUJAIRAH
+13|0|211378120|211217560|0|0|0
+14|0|351809000|RCVD YR TEST MSG
+14|0|237008900|EP228 IX48 FG3 DK7 PL56.
+14|0|311764000|TEST
+15|0|368578000|5158|5|0|0|0|0|0|0
+15|3|003669720|367014320|3|516|5|617|0|0|0
+16|0|002053501|224251000|200|0|0|0|0
+17|0|002734450|17478|35992|376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
+18|0|338087471|0|1|0|-44443279|24410724|796|511|49,0x0|1|0|1|1|1|1,0xe0006
+18|0|338088483|0|0|0|-42486718|25869335|1716|511|20,0x0|1|0|1|1|1|1,0xe0006
+18|0|368161000|0|51|1|-43340309|23688555|349|511|17,0x0|1|0|1|1|0|1,0xe0006
+19|0|367059850|248|87|0|-53286235|17726217|3359|511|46,0x4|CAPT.J.RIMES|70|5|21|4|4|0|0|0|0
+20|3|003669705|2182|5|7|225|0|0|0|0|0|0|0|0|0|0|0|0
+20|0|003160097|47|1|7|250|2250|1|7|1125|856|5|7|1125|0|0|0|0
+21|0|123456789|20|CHINA ROSE MURPHY EXPRESS ALERT|0|-73619155|28752371|5|5|5|5|1|50|165,0x0|0|0
+22|0|003160048|2087|2088|0|0|-44100|27330|-48100|25400|0|0|0|4
+23|0|002268120|1578|30642|1096|30408|6|0|2|9|0
+24|2|338085242|CAPTAIN'S PARADISE,54,ACR1234|WDD7883,8|3|2|1
+5|0|271010059|0|0|TCA2350|HEALTH CONTROL 13|55|6|10|2|2|1|00-00T24:60Z|20||0
+5|0|271010059|0|0|TCA2350|HEALTH CONTROL 13|55|6|10|2|2|1|00-00T24:60Z|20||0