Supported formats

"The same data" looks very different depending on which tool exported it. Rather than publish a list of formats we hope work, this page is generated from the test corpus: 47 files (19 centroid, 24 failure, 4 config) that both implementations are run against on every change. One canonical board and dataset, re-expressed in each dialect, asserted to produce identical results.

Handled automatically

Structure

Comma, semicolon, tab and pipe delimiters, detected per file. UTF-8 byte order marks, CRLF endings, quoted fields containing the delimiter, and title or metadata rows above the header.

Numbers, dates and encodings

European decimal commas and thousands separators; dd-Mon-yyyy, yyyy/mm/dd, US m/d/y and two-digit years; Excel day serials; Windows-1252 files that would otherwise arrive as mojibake.

Excel workbooks

.xlsx is read directly. Shared strings and rich text are resolved, date-formatted cells are converted from day serials, and the sheet that was read — plus the ones that were not — is named, so data on another tab is visible rather than silently absent.

Column naming

Flexible aliases for designator, coordinate, date, quantity and assembly columns, including headings that carry their unit (Center-X(mil)) and defect columns matched by prefix (Defect Description, Failure Mode). Cells naming several parts (U7, U8) become separate records.

Refused, with a reason

Being permissive about the wrong things is worse than being strict. A placement export, a bill of materials, or a JSON document whose array is not defect records would each invent one "failure" per part, so each is rejected and told why. A recognized file that yields no records is an error, not a quiet success.

Placement / pick-and-place files

Example fileWhat it exercisesResult
centroid_comma.csv plain comma CSV parsed
centroid_tab.txt tab-delimited (Altium .txt) parsed
centroid_semicolon_eu.csv semicolon delimiter with comma decimals (European Excel) parsed
centroid_units_mm.csv units written into the value (Altium default) parsed
centroid_units_mil.csv mil units declared in the values parsed
centroid_bom.csv UTF-8 BOM (Excel save-as) parsed
centroid_crlf.csv CRLF line endings parsed
centroid_preamble.csv metadata/title lines above the header parsed
centroid_kicad.pos KiCad .pos — '#' header, whitespace separated parsed
centroid_quoted.csv quoted fields containing the delimiter parsed
centroid_aliases.csv alternative column names parsed
centroid_offset_origin.csv origin offset far from 0,0 — must not be mistaken for a huge board parsed
centroid_negative.csv negative coordinates parsed
centroid_duplicate.csv the same designator twice parsed
centroid_header_units.csv unit declared in the column heading, not the value (Altium mil) parsed
centroid_eagle.mnt headerless whitespace report (Eagle .mnt) parsed
centroid_blank_coords.csv rows with blank / non-numeric coordinates are counted, not silently dropped parsed
centroid_empty.csv empty file rejected, with a reason
centroid_no_columns.csv a BOM, not placement data rejected, with a reason

Failure data

Example fileWhat it exercisesResult
failures_ict_comma.csv ICT CSV, comma parsed
failures_ict_semicolon.csv ICT CSV, semicolon parsed
failures_ict_tab.txt ICT CSV, tab parsed
failures_ict_bom_crlf.csv ICT CSV, BOM + CRLF parsed
failures_ict_titlerow.csv title row above the header parsed
failures_repair.txt pipe-delimited repair log, US dates, free-text defects parsed
failures_qms.json QMS JSON parsed
failures_qms_bare_array.json bare top-level JSON array with alternative keys parsed
failures_generic_dates.csv generic CSV with dd-Mon-yyyy dates and free-text faults parsed
failures_multi_refdes.csv several designators in one cell parsed
failures_pipe_in_cell.csv one cell contains pipes — must not hijack the file into the repair-log parser parsed
failures_qty.csv thousands-separated quantity; an explicit quantity of 0 is not a failure parsed
failures_blank_refdes.csv rows with no designator are counted as unusable, not dropped in silence parsed
failures_qms_bom.json QMS JSON saved with a UTF-8 BOM parsed
failures_defect_description.csv defect column named 'Defect Description' rather than an exact alias parsed
failures_ampersand.csv '&'-joined designators, and a 'Failure Mode' defect column parsed
failures_padded_refdes.csv zero-padded designators are parsed verbatim, not silently renamed parsed
failures_multi_assembly.csv one export spanning two assemblies parsed
failures_bom.csv a BOM would otherwise become one failure per part rejected, with a reason
failures_placement.json placement data under a generic 'data' key must not pass as a QMS export rejected, with a reason
failures_kicad_placement.csv KiCad placement CSV dropped into the failure intake rejected, with a reason
failures_empty_records.json recognized but contains nothing rejected, with a reason
failures_no_refdes.csv no designator column at all rejected, with a reason
failures_workbook.xlsx Excel workbook: shared strings, a second sheet, and dates stored as day serials parsed

Criticality configuration

Example fileWhat it exercisesResult
config_comma.csv config with mixed-case values parsed
config_semicolon.csv semicolon config with alias column names parsed
config_empty.csv empty config rejected, with a reason
config_no_refdes.csv config with no designator column rejected, with a reason

Something not on this list?

Reading a new export dialect is a small, contained change — the adapters are deliberately isolated from everything downstream. Send a sample (with anything sensitive removed) to support@engsecsolutions.com and it will be added to this corpus, which means it stays working.