PTS Comma-Delimited File Standard

Home » PTS Comma-Delimited File Standard

PTS Comma-Delimited File Standard Revision 1.10
Feb 1, 2022
Programmers please read the following points carefully:

1. When string fields contain quotation marks within them the embedded
quotation mark characters (symbol “) will be changed to the percent
character (symbol %) when exported by the Post Time Daily. This is
due to the fact that some languages do not deal with embedded quotes
properly.

2. When strings contain no information they may be space filled or they
may appear in the comma delimited files as two quotes with nothing in
between. Our preference is that at some future time if the information
for a string field is not available it will contain nothing between the
quotes. But we have had many reports from Visual Basic programmers that
truly empty strings (NULL) are in some way a problem. PLEASE MAKE SURE
that your program can handle space filled strings and empty (NULL)
strings. Also don’t assume that if a field is defined as string(22) that
it will be filled with 22 spaces if empty. It might not. If your
programming tool has some kind of trim function we would recommend that
you trim all strings and then check their length to determine if they
have information or not. That seems safe to us but other methods can
work as well.

3. No assumptions should be made about the order of the entrants in the
comma delimited files. The comma delimited files may be in post
position order, saddle cloth order, or technically in any other order.
The horses in the horse file currently export in the same order as the
horses listed in the entrant file but while we DON’T expect that to
change that is not guaranteed either.

4. We will be setting up a system to ensure that those of you who
depend on comma delimted files will be emailed WELL in advance of any
proposed changes and that you will have a chance to give us input into
these changes.

5. Do not assume that there will be only up to ten pacelines per horse.
We are currently putting out 12-14 paceslines at some tracks and may add
more at a later date. Field 7 of the ENT file (numberOfPacelines) is
the only valid way to determine how many pacelines are present for a
horse. You can always choose to ignore those you don’t want to use.

6. Regarding Y2K compliance. There is NOTHING about year two thousand
compliance (contrary to popular opinion) that REQUIRES four character
date codes. However software which does NOT use two character date
codes intelligently (e.g. where the year can’t be determined based on
some semantic context) will have problems. We will notify you well
prior to expanding the year code to four digits so that you have time to
update your software. If you can plan for this now and allow for the
possibility that the date fields will changed to MM/DD/YYYY in the
future that would certainly be desireable. You can determine whether
you are dealing with an old or new date by checking the length of the
date field. New date fields will be 10 characters long. Old date
fields will be 8 characters long.

7. Programmers – DO NOT HARDCODE the Version string in the sense that
you are looking for ONE particular VALUE. We will update this with
every major revision of this document. So if you need to check for
changes incorporated into a particular version please convert field 1 of
the RAC file (Version String) to a number and check by making sure that
the version is 1.5 OR GREATER. Do NOT code for = to version 1.5 as your
code will SURELY break when we update this field.

Sample comma delimited files are available on our website via the home
page at http://www.posttimedaily.com

The PTS Comma-Delimited File Standard defines a set of five comma
delimited files which together comprise a card of racing at any
racetrack.

Our current product, the Post Time Daily will allow exporting our
current PTS data file to this PTS Comma Delimited File Standard.

The file naming conventions for the Export files are as follows where E
is a constant, TTT is the track code (two or three characters), MM is
the month, DD is the date, and YY is the two digit decimal year code.
If the track code is two characters, for file naming purposes only, we
will use an underscore for the third character.

ETTTMMDD.RYY (for race records)
ETTTMMDD.CYY (for class string info for race)
ETTTMMDD.EYY (for entry records – horse specific)
ETTTMMDD.WYY (for workout records)
ETTTMMDD.HYY (for horse records – paceline level)

While the file structures are not totally normalized (if you don’t
understand this term don’t worry), we have tried to make them somewhat
relational. The .CLS file which contains the conditions of the race
from the racing form can be up to 4100 bytes in length. That is the
class information that appears at the top of the race as the race
conditions. Because of that, while it logically belongs in the .RAC
file, we have extracted it into a separate file so that those of you who
cannot handle a string file of this length can ignore it. AT THE END OF
THIS CLASS STRING THERE WILL BE A CARRIAGE RETURN CHARACTER (hex 0x0D)
followed by the bet types separated by additional CARRIAGE RETURNS if
they appear on multiple lines.

The following conventions are followed in this comma-delimited file
structure. All string fields are enclosed in double quotation marks.
String fields which contain embedded quote characters (symbol “) will
have these embedded quote characters changed to the percent character
(symbol %). All numeric fields are not enclosed in quotes. Fields
defined as date fields are expressed as strings of the form MM/DD/YY and
enclosed in quotes just like any other string. Some combination of
fields in each record will always constitute a unique key. And there is
a well defined way to navigate all 1 to many relationships in these
files.
================ Developers – THE NEXT NOTES ARE VERY IMPORTANT ==========

The following is a list of fields which are NOT currently used but might
be in the future.

RAC FILE
not currently used field 22, 23

CLS FILE
none

ENT FILE
Not currently used field 76, 77, 79

WOR FILE
Currently the product allows for up to 12 workouts in the Post Time Daily
Changes to this will require a product upgrade, but we might do this in the
future. Don’t make ANY assumptions about how many work outs we will provide.

HOR FILE
not currently used field 21 (we hope to have this back shortly)
not currently used field 60, 61-64
not currently used field 80, 81 (we hope to have these back shortly)
NOTE: VERY IMPORTANT INFORMATION ABOUT FRACTIONAL TIMES IN THE HOR FILE
We have set up these times in such a way that traditional pace handicappers who need
the 2f and 4f time in sprints, and the 4f and 6f time in routes will always find them in the
firstCallTime (field 27) and the secondCallTime (field 28).

If a time appears with a ZERO value that means it was not available or is not recorded at
a particular distance.
Sprints
(Obviously sprints 4f and shorter cannot have a 4f internal time!)
(Many of these shorter sprints will also not have an additionalFractionalTime)
(At some tracks these short sprints will have a 2f time but no 4f time)
(Example DeD at 4-1/2f seems to report 2f time and final time in some races
and 2f time and 4f time in others)

depending on the track where they are run)
firstCallTime 2f time
secondCallTime 4f time
finalTime as expected

additionalFractionalTime (field 30) is the stretch call time in sprints

Sprints between 5-1/2 and 6f
additionalFractionalTime (field 30) is 5/8 time

Sprints between 6-1/2 and 7-1/2f
additionalFractionalTime (field 30) is 6f time

Routes

firstCallTime 4f time
secondCallTime 6f time
finalTime as expected

Routes between 8f and 8-1/2f (inclusive)
additionalFractionalTime (field 30) is 2f time

Routes above 8-1/2f
additionalFractionalTime (field 30) is 8f time
=======================================================================
File #1 the .RAC file

There will be one .RAC record for each race which is running at a track.

field# fieldtype description

field 1 string(4) versionString (Currently 1.10)
field 2 date race date
field 3 string (3) track code for today’s race
field 4 numeric race number for today’s race
field 5 string (3) Actual track code if a simulcast race
(empty if not used)
field 6 numeric Actual race number if a simulcast race (zero
if not used)
field 7 numeric distance of race in feet Example 6 furlongs is
3960 feet
field 8 numeric inner 0=false, 1=true
field 9 numeric turf 0=false, 1= true
field 10 numeric about 0=false, 1=true
field 11 numeric raceClass 0 = MCLM
1 = MSW
2 = CLM
3 = ALW
4 = STKS
5 = HDCP

field 12 numeric topClaimingPrice (for MCLM or CLM)
field 13 numeric bottomClaimingPrice (for MCLM or CLM)

field 14 numeric purse of race
field 15 string (3) ageRestrictions 2, 2UP, 3, 3UP, 4, 4UP
5, 5UP
field 16 numeric sexRestrictions 0=MALE, 1=FEMALE, 2=MIXED
field 17 numeric stateBred 0=false, 1=true
field 18 numeric restrictedStakes 0=false, 1=true
This corresponds to the R
symbol in the printed past performance.
field 19 numeric stk/hdcp grade 0 = We don’t know
1 = GR I
2 = GR II
3 = GR III
field 20 string (21) abbrevClass abbreviated Class

Similar to what is
currently printed on the past
performance line in the Handicappers
Daily.

Example: Alw 42000N1x
Alw 47500N$(3m)
LasFlorsBCH-G3
Md Sp Wt
Clm 25000

field 21 string (5) posttime h:mm in local time
field 22 string (1) track time zone current track time zone
E=Eastern, C=Central,
M=Mountain, P=Pacific
(not currently used)
field 23 string (5) gmtAdjustmentFactor amount to change
posttime to express
it as GMT
(not currently used)

field 24 string (25) descriptiveTrackName

field 25 numeric track record at the distance in seconds.
So 6f record of 1:08:1 is 68.2 seconds

field 26 string localPostTime24 The race’s local post time using a 24-hour clock (HH:mm)
field 27 string reservedString2
field 28 numeric courseType 0=Dirt, 1=Turf, 2=Inner Dirt, 3=Inner Turf,
5=Outer Turf, 7=Downhill Turf, 8=All Weather,
33=Hurdle, 65=Steeplechase, 97=Jumps (other)
field 29 numeric reservedNumber2

===========================================================================
File #2 the .CLS file

There will be one .CLS record for each race which is running at a track.
The first three fields (fields 1-3) provide a unique key for this
record. It can be used to relate the .RAC and .CLS files. There is a
one-to-one relationship between them. As explained above this is a
separate record only for convenience of users who cannot handle a string
field that is potentially 4000 bytes in size.

field# fieldtype description

field 1 date race date
field 2 string (3) track code for today’s race
field 3 numeric race number for today’s race
field 4 string (4100) full class description (up to 4100 chars)

===========================================================================
File #3 the .ENT file

There will be many .ENT records for each race which is running at a
track. Generally for each .RAC record there will be many .ENT records
although there could be zero or 1 as well. The first three fields date,
track, and racenumber can be used to find all the .ENT records for each
.RAC record. There is a 1 to many relationship between .RAC and .ENT.
The first four fields (fields 1-4) provide a unique key for this record.
It can be used to relate the .ENT and .HOR files. There is a
one-to-many relationship between the .ENT file and the .HOR file.

Note: Past performances that are downloaded after the saddle cloth
numbers are assigned will have these fields already filled in without
downloading the additional free saddle cloth file. If pps were
downloaded prior to these assignments then the free saddle cloth file
will still be needed to fill in these fields.

field# fieldtype description

field 1 date race date
field 2 string (3) track code for today’s race
field 3 numeric race number for today’s race
field 4 string (22) horse name
field 5 string (4) saddleClothNumber (if you have
downloaded the
free saddle cloth file)
field 6 string (5) morningLine (if you have downloaded the
free saddle cloth file)
field 7 numeric number of pacelines (or horse records)
first times starters will have zero as will
other horses with no info for some reason
field 8 string (1) entryChar (blank for single starters – Entries
will share a matching char
code starting with A and going down
the alphabet)
field 9 numeric scratchFlag 0=false, 1=true
field 10 numeric current or thisYear for earnings box(19xx)
The year in the earnings box. If the horse
was laid off, this may not be the current year.
field 11 numeric startsThisYear
field 12 numeric winsThisYear
field 13 numeric placesThisYear
field 14 numeric showsThisYear
field 15 numeric earningsThisYear
field 16 numeric previous year for earnings box(19xx)
field 17 numeric startsPreviousYear
field 18 numeric winPreviousYear
field 19 numeric placesPreviousYear
field 20 numeric showsPreviousYear
field 21 numeric earningsPreviousYear

field 22 string (40) ownerName
field 23 string (5) color
field 24 numeric yearborn
field 25 numeric monthborn
field 26 string (5) state bred in
field 27 numeric age
field 28 string (1) sex

field 29 string (22) sire name
field 30 string (22) sires sire
field 31 string (22) dam
field 32 string (22) dams sire
field 33 string (22) trainerName

field 34 string (58) breederName

field 35 numeric trainer starts (at the current meet)
field 36 numeric trainer wins
field 37 numeric trainer places
field 38 numeric trainer shows
field 39 numeric trainer pct 0.00 thru 0.99

field 40 numeric lasix Indicator 0=no, 1=yes
field 41 numeric bute Indicator 0=no, 1=yes
field 42 numeric weightAssigned (the bold weight in form)
field 43 numeric apprentice wt allowance
field 44 string (22) jockeyName

field 45 numeric jockey starts (at the current meet)
field 46 numeric jockey wins
field 47 numeric jockey places
field 48 numeric jockey shows
field 49 numeric jockey pct 0.00 thru 0.99

field 50 numeric claimingPrice (if MCLM or CLM race)
field 51 numeric lifetimeStarts
field 52 numeric lifetimeWins
field 53 numeric lifetimePlaces
field 54 numeric lifetimeShows
field 55 numeric lifetimeEarnings
field 56 numeric trackStarts (at this track regardless of surface or inner / outer
distinctions)
field 57 numeric trackWins
field 58 numeric trackPlaces
field 59 numeric trackShows
field 60 numeric trackEarnings
field 61 numeric turfStarts
field 62 numeric turfWins
field 63 numeric turfPlaces
field 64 numeric turfShows
field 65 numeric turfEarnings
field 66 numeric wetStarts
field 67 numeric wetWins
field 68 numeric wetPlaces
field 69 numeric wetShows
field 70 numeric wetEarnings
field 71 numeric distStarts (at the exact distance regardless of surface)
field 72 numeric distWins
field 73 numeric distPlaces
field 74 numeric distShows
field 75 numeric distEarnings

field 76 numeric alsoeligible 0=false, 1=true
field 77 numeric partoffield 0=false, 1=true (Not currently used)
field 78 numeric blinkersToday 0=no change, 1=on, 2=off
field 79 numeric bandagesToday 0=false, 1=true (Not currently used)
field 80 string(40) jockeyStatsYTD The complete jockeyStatsYTD string in unparsed form
field 81 string(40) trainerStatsYTD The complete trainerStatsYTD string in unparsed form
field 82 string reservedString3
field 83 string reservedString4
field 84 numeric postPosition postposition (0 if not available)
field 85 numeric off track rating -1 means that there is no rating
field 86 numeric turf rating -1 means that there is no rating
field 87 numeric first time lasix 0 = no, 1 = first time lasix

=========================================================================
File #4 the .WOR file

There will be many .WOR records for each race which is running at a
track. The first five fields (fields 1-5) provide a unique key for this
record. The first four fields are used to relate the .ENT and .WOR
files. There is a one-to-many relationship between them. Generally for
each .ENT record there can be many .WOR records although there could be
zero or 1 as well. While we currently only have up to 4 workouts for
each horse, we expect to ship many more WOR records in the future.
Don’t assume a maximum number. At least up to twelve will be provided
in a future update.

field 1 date race date
field 2 string (3) track code for today’s race
field 3 numeric race number for today’s race
field 4 string (22) horse name

field 5 date date of workout
field 6 string (3) workout track
field 7 numeric workout distance in feet
field 8 numeric inner indicator (0=false, 1=true)
field 9 numeric turf indicator (0=false, 1=true)
field 10 numeric training track indicator (0=false, 1=true)
field 11 string workout track conditions (fst, fm, etc;)
field 12 numeric workout time in seconds just like pace times.
So 6f in 1:10:2 is 70.4 seconds
field 13 numeric breezing indicator (0=false, 1=true)
field 14 numeric handily indicator (0=false, 1=true)
field 15 numeric bullet indicator (0=false, 1=true)
field 16 numeric dogsUp indicator (0=false, 1=true)
field 17 numeric gate workout indicator (0=false, 1=true)

field 18 numeric workout rank for the day
field 19 numeric total number of workouts for day

field 20 string reservedString1
field 21 string reservedString2
field 22 numeric courseType 0=Dirt, 1=Turf, 2=Inner Dirt, 3=Inner Turf,
5=Outer Turf, 7=Downhill Turf, 8=All Weather,
33=Hurdle, 65=Steeplechase, 97=Jumps (other)
field 23 numeric reservedNumber2

============================================================================
File #5 the .HOR file

There will be many .HOR records for each race which is running at a
track. The first five fields (fields 1-5) provide a unique key for this
record. The first four fields are used to relate the .ENT and .HOR
files. There is a one-to-many relationship between them. Generally for
each .ENT record there will be many .HOR records although there could be
zero or 1 as well.

field# fieldtype description

field 1 date race date
field 2 string (3) track code for today’s race
field 3 numeric race number for today’s race
field 4 string (22) horse name
field 5 date date of paceline
field 6 string (3) track code of paceline
field 7 numeric racenumber of paceline
field 8 numeric distance of paceline race in feet
field 9 numeric inner 0=false, 1=true
field 10 numeric turf 0=false, 1= true
field 11 numeric about 0=false, 1=true
field 12 numeric off the turf 0=false, 1=true
field 13 string (3) track condition (fst, fm etc;)
field 14 numeric threeAndUp indicator (0=false, 1=true)
field 15 numeric fillie Indicator (0=false, 1=true)
field 16 numeric statebred Indicator (0=false, 1=true)
field 17 numeric restricted Indicator (0=false, 1=true)

field 18 string (3) Age restrictions of race. 2, 2UP, 3, 3UP,
4, 4UP, 5, 5UP

field 19 numeric 0=MALE, 1=FEMALE, 2=MIXED

Very important – You can use the below field to parse any class information
we may have left out. It will be just as Equibase provides it
to us.

field 20 string (21) class string (just as it appears in racing
form except for (S, R, 3up, F indicators)

Just like field 20 of the .RAC file (file #1)

field 21 string (45) extendedClassInfo More extensive class information
when available for foreign horses.
This might have the full name of the
stakes race as well as the Grade.
Generally just available for some
foreign pacelines.

field 22 numeric purse purse of the paceline race. We will
provide this whenever we have it.
This means that for claiming races you
will have not only the claiming price
but the PURSE of the claiming race

field 23 numeric claiming price if CLM or MCLM race
field 24 numeric raceClass 0 = MCLM
1 = MSW
2 = CLM
3 = ALW
4 = STKS
5 = HDCP

field 25 numeric stk/hdcp grade 0 = We don’t know
1 = GR I
2 = GR II
3 = GR III

field 26 numeric claimed indicator (0=not a claim, 1=claimed)

Time in fields 27-30 are expressed in seconds and hundreths of a second.
So if when printing in fifths if the time appears as 1:10:3 this is
converted to 70.6. At some time in the future these times will contain
the times in hundreths of a second when available. At that time the
Post Time Daily will allow for the option of displaying both fifths
and hundreths. Quarter horses are already in hundreths for display
purposes and are exported in hundreths as well.

field 27 numeric firstCallTime
field 28 numeric secondCallTime
field 29 numeric finalTime
field 30 numeric additionalFractionalTime

field 31 numeric Post position
field 32 numeric Start call Position

Note: If the Position Call was not available
it will have a value ZERO.

field 33 numeric first call Position
field 34 numeric second call Position
field 35 numeric stretch call Position
field 36 numeric final call Position.

All beaten lengths in fields 37-40 are in decimal. A hd is allowed .15,
a neck 0.20 and a nose 0.10. So if the past performces says 3-1/4 we
have 3.25. If the pps says 1hd we have 0.15.

Also NOTE that if a horse is ON THE LEAD at a particular call position
then the beaten lengths field will actually be the margin of lead at
that position.

IMPORTANT – If the beaten lengths field is ZERO this indicates that the
information was unavailable. No horse not on the lead can ever have a
valid beaten lenght of zero. And no horse on the lead can ever have a
leading margin of ZERO. Thus ZERO denotes a missing value.

IF A horse was EASED it will generally have a POSITION CALL OF ZERO and
BEATEN LENGTHS of 99.75. Checking for 99 or more in the beaten lengths
should be sufficient!

HORSE that had NO INFO at a point of call (for Example foreign horse
internals) will have POSITION CALLS of ZERO and BEATEN LENGTHS OF ZERO.

field 37 numeric first call beaten lengths (or leading margin when position call = 1)
field 38 numeric second call beaten lengths (or leading margin when position call = 1)
field 39 numeric stretch call beaten lengths (or leading margin when position call = 1)
field 40 numeric final beaten lengths (or leading margin when position call = 1)

field 41 string (22) jockey name
field 42 numeric lasix indicator (0=false, 1=true)
field 43 numeric bute indicator (0=false, 1=true)
field 44 numeric weight carried
field 45 numeric blinkers indicator (0=false, 1=true)
field 46 numeric front wraps indicator (0=false, 1=true)

field 47 numeric favorite flag (0=false, 1=true)
field 48 numeric odds at posttime
field 49 numeric odds ranking of favoritism with favorite being 1
field 50 numeric coupled indicator (0=false, 1=true)
field 51 numeric dead heat indicator (0=false, 1=true)
field 52 numeric disqualified indicator (0=false, 1=true)
field 53 numeric placement if disqualified (zero otherwise)
field 54 numeric speed rating
field 55 numeric track variant
field 56 numeric advanced speed figure (ASF)
Some special cases:
-1 means blank in past performances (probably foreign horse)
998 means -0 appears in past performances
999 means – appears in past performances

field 57 numeric PTS Early Pace Rating
field 58 numeric PTS Late Pace Rating
field 59 numeric PTS True Pace Rating
field 60 numeric PTS Speed Rating
(not currently used)

Fields 61-64 are not currently used but will be in the future. These
variant fields will contain the PTS variants. In races under 1M,
the 1st fraction is the 2F call, and the second call is the 4F point.
In races of 1M to 1M-3/16 the 1st fraction is the 4F call and the second
call is the 6F point. The additional point of call will be for another
internal fraction in some cases. This will all be documented in the
future. The variant will be a positive (track slow) or negative (track
fast) adjustment to the raw times in the DRF.

field 61 numeric PTS Early Pace Variant 1st fraction
field 62 numeric PTS Early Pace Variant 2nd call
field 63 numeric PTS Final time Variant
field 64 numeric PTS Additional Point of call Variant to be determined

Following info is company line information
field 65 string (22) horse1 (win)
field 66 numeric horse1 weight
field 67 numeric horse1 margin over next horse
field 68 string (22) horse2 (place)
field 69 numeric horse2 weight
field 70 numeric horse2 margin over next horse
field 71 string (22) horse3 (show)
field 72 numeric horse3 weight
field 73 numeric horse3 margin over next horse

field 74 string (22) trouble line
field 75 numeric number of entrants

Following info (fields 76 – 79) relates to stuff that appears on second
(extended) line of PP’s or to things we are not sure we will have from
Equibase. They are currently not used (except for 78) but will be in the
future. They are also subject to Equibase providing them to us, or us
building up our database!

field 76 string (22) When claimed, the original trainer
field 77 string (35) When claimed, the original owner

field 78 string (72) extended trouble line information

field 79 string (10) disqualification comments – if available
field 80 string Foreign Track description
field 81 string Foreign Track direction, if available (LH, RH, Str)
field 82 string Trainer name
field 83 string Owner name

field 84 numeric typeOfPacelineRace 0=Thoroughbred, 1=Qtr Horse Race
2=Steeplechase, 3=Hurdle, 4=Foreign
(Currently only 0, 1, 4 are used)
field 85 numeric Apprentice Weight Allowance
field 86 numeric courseType 0=Dirt, 1=Turf, 2=Inner Dirt, 3=Inner Turf,
5=Outer Turf, 7=Downhill Turf, 8=All Weather,
33=Hurdle, 65=Steeplechase, 97=Jumps (other)
field 87 numeric reservedNumber4
===========================================================================

Last updated on: 2/1/2022
Copyright 2022 by Value Tech, Inc.