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.
| Version | 1.2.1 |
| Platforms | Windows 10/11; macOS on Apple Silicon |
| Input | Excel templates (preferred), other spreadsheets / CSV, results PDFs |
| Output | SDIF v3 .sd3 |
| Swimmer data stored | None |
| Owner | Caleb McPherson |
- Parses rows / lines
- Prompts for missing fields
- Validates SDIF v3
Workflow
- 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.
- 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.
- 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).
- Validate and save. Check & save lists missing required fields, warnings and notes, and shows every record field by field. Save the
.sd3and 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.
Release notes
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).
- Meet results template one row per swim; relays with leg swimmers
- Best times template one block per swimmer
- Sample filled-in meet synthetic data for testing
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
.sd3the 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, times | No |
| Copies of imported files | No |
| Submitter name and phone | Yes |
| 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
- Problems with a file: send the file, the
.sd3(if any) and a description. Unreadable lines are listed on the app's Files page. - App errors: the app shows an error window with Copy details; the log is under Help → Open log file folder.
- Contact: Caleb McPherson.