SD3 Import Tool

Internal tool · prototype for evaluation

SD3 Import Tool

A desktop app for Windows and Mac that converts swim meet results (Excel, CSV or PDF) into a USA Swimming SDIF v3 .sd3 file for import into team software. It prompts for anything the source file doesn't contain and validates the output before saving.

Version1.2.1
PlatformsWindows 10/11; macOS on Apple Silicon
InputExcel templates (preferred), other spreadsheets / CSV, results PDFs
OutputSDIF v3 .sd3
Swimmer data storedNone
OwnerCaleb McPherson
.xlsxTemplate
.pdfFallback
SD3 Import Tool
  • Parses rows / lines
  • Prompts for missing fields
  • Validates SDIF v3
.sd3Output

Workflow

  1. Get the results file. Preferably one of the two Excel templates below, filled in by the host team. Other spreadsheets, CSV and text PDFs from meet software also work.
  2. Import. Add one or more files (they are combined). Rows or lines that can't be parsed are listed on the Files page with the reason.
  3. Complete the missing fields. The app asks for what SDIF requires and the file lacks: meet name, dates and location, host, team LSC and club codes, the submitter's contact, and swimmer IDs (real, built from a birth date, or placeholders).
  4. Validate and save. Check & save lists missing required fields, warnings and notes, and shows every record field by field. Save the .sd3 and import it into team software.

Inputs and output

Excel templates

Two layouts: meet results (one row per swim; relays as a team row plus one row per leg swimmer, leg 1 = lead-off) and best times (swimmer details once, swims below). Recognised without any column setup.

Other spreadsheets and CSV

Columns are matched by their headings (Name, Team, Event, Finals time…). The mapping is shown at import and can be changed per column.

Results PDFs (fallback)

Text PDFs from meet software, including two-column pages, relay legs and splits. Scanned PDFs have no text and can't be read. Layouts vary by vendor.

Swimmer IDs

Uses IDs from the file; builds the old-style 14-character ID from a birth date; or fills placeholder IDs (000000SUE*ANDE) that can't match a real swimmer.

Relays and lead-offs

Each leg swimmer gets an F0 record with their leg time and a G0 split record with the relay's cumulative time at the end of their leg, matching meet-software output. Leg 1's split is the lead-off. Optionally (off by default) the lead-off is also written as a separate D0 swim.

Output

SDIF v3 records A0, B1/B2, C1/C2, D0/D3, E0/F0, G0, Z0. Several meets in one file become separate B1 sections. Optional LSC in D0 columns 4–5.

Downloads

Version 1.2.1. Single file; no installer and no admin rights needed.

First launch (unsigned build)

The builds are not code-signed yet, so the OS asks once before opening.

Windows: "Windows protected your PC" → More info → Run anyway.

Mac: open the .dmg, drag the app to Applications. If macOS can't verify it: System Settings → Privacy & Security → Open Anyway.

Excel templates

Each includes an Instructions sheet with examples; that sheet is ignored on import. The app can also save these (File → Download Excel template).

Data handling

Most swimmers in these files are minors. The app does not persist any swimmer data.

  • Swimmer names, birth dates, IDs, ages and times are held in memory only, and written only to the .sd3 the user saves. Closing the app (or Start over) discards them; closing with unsaved results asks first.
  • No uploads. The app works offline. Its only network request is an optional daily update check to this site, which sends the app version only.
  • Persisted locally, per user: the submitter's own name and phone (A0 record), the team directory (LSC, club code, team names, coach name and phone), pool locations and display settings.
  • The error log records stack locations only; exception messages and file names (which can contain swimmer data) are not logged.
  • Automated tests import sample files, then search every settings and log file for every swimmer name, ID and birth date seen.

Stored on the user's computer

Swimmer names, IDs, birth dates, timesNo
Copies of imported filesNo
Submitter name and phoneYes
Team directory (incl. coach contact)Yes
Error log (code locations only)Yes

Technical details

Footprint

One executable per platform; no installer, service or admin rights. Settings: %APPDATA%\SD3MeetBuilder (Windows), ~/Library/Application Support/SD3MeetBuilder (Mac).

Network

Optional daily check of /downloads/latest.json on this site. Shows release notes and a download link; never downloads or installs by itself. Configurable or off under Settings → Updates.

Stack

Python 3.12 with Tk, packaged with PyInstaller. Libraries: pdfplumber (MIT), openpyxl (MIT), xlrd (BSD). No vendor code.

Testing

Every change runs about 250 automated checks on Windows, macOS and Linux (GitHub Actions), including an independent SDIF v3 validator on the output.

Releases

Built by GitHub Actions for Windows and Mac, published as a GitHub release, then copied to this site. Source: private repository CalebMcPherson/sd3-builder.

Format reference

USA Swimming SDIF version 3: fixed 160-character records, CR LF line endings; required fields checked before saving.

Known limitations

  • Unsigned builds. First launch shows an OS warning (see Downloads). Signing needs a Windows code-signing certificate and an Apple Developer account.
  • Apple Silicon only. No Intel Mac build yet.
  • PDF layouts vary. Tested against a limited set of PDFs. Multi-day PDFs often don't print a date per event, so swims default to the meet's first day. The Excel templates avoid this.
  • Best-times data has no age groups. Those swims are written as Open (UNOV) events.
  • Lead-offs. Written as leg 1's G0 split, the same as a meet-software export. Import into the team's software should be checked once with a real file.
  • One meet at a time in the UI. No batch conversion of many files with saved defaults.

Support