The most useful blank in the delivery was one we refused to fill.
A source page behind every value and a stated reason behind every blank.
records imported into PDM in one batch
item code completeness, generated by rule
rows recovered by our own completeness check before handover
Situation
Their item data was their own stated priority, not ours: they had said it was the first thing to fix. A principal’s full catalogue had to become records they could sell from. The catalogue existed, but as a price list and a set of datasheets. Turning that into item records meant reading a type number, a material, a size and a price out of documents laid out for a human reader, and doing it the same way every time across thousands of rows.
- A price list and datasheets laid out for a human reader
- Type number, size and material inside one line of text
- List prices in a separate document
- Item records imported into PDM in one batch
- Each value in its own field, with its source page
- Current list prices joined on, increases above the threshold flagged
What was done
One principal’s catalogue taken end to end first, rather than sampling across many, so the method could be proven before it was repeated.
Item codes generated by a deterministic rule rather than by a model, so the customer-facing identifier could not drift between runs.
Every row carrying the principal’s own order reference where the principal publishes one.
Current list prices joined on, with every price increase above a threshold flagged for a person rather than passed through quietly.
A source-page column on every row: which page of which document each value came from, and where there was no value, the reason there was none.
Curator notes kept in their own column, never inside a value cell.
Result
- 2 736 records from one principal’s catalogue, imported into PDM in one batch, every item code generated by rule and complete across all of them.
- Current list prices where the principal publishes them, with every increase above the threshold flagged.
- A source page behind every value, and a stated reason behind every blank.
A blank can be the correct answer.
Whole valves missing
A completeness check before handover found that whole valves were missing. The parser had been reading the datasheets by column position, and on the sheets where the largest sizes sat in a shifted column, those rows had been dropped entirely: not a missing field, the whole item gone. We re-extracted by anchoring on the order reference instead of on the position, which recovered twenty-four more references and a hundred and forty-four more rows, and checked the recovered rows against the originals before they went anywhere.
Rule nowExtraction anchored on the order reference, then checked against the originals.
A blank we chose to keep
A second thing we chose not to fix. The principal prints its order reference only on some of its material sheets, so a large share of rows have no reference at all. That blank is correct: the reference is the principal’s own order number, and inventing one would put a wrong number into an ordering process. It went back as a request to the principal rather than as a filled cell.
Rule nowAn order reference is never invented.
One row from the catalogue
Illustrative, not the customer’s data: a line as the principal’s price list prints it, and the record that went back.
| Row | Item code | Description | Size | Material | Order reference | List price |
|---|---|---|---|---|---|---|
| In the price list | — | KV-2 DN25 PN40 1.4408 FL | — | — | — | 198,00 |
| Delivered | VLV-KV2-025-40-S by rule | KV-2 DN25 PN40 1.4408 FL | DN25 PN40 p. 4 | 1.4408 p. 4 | not published by the principal | 214.00 increase flagged |
Have a principal’s catalogue that should become records?
- 1Send the price list and the datasheets as you have them.
- 2Within days you see records with a source page behind every value and a stated reason behind every blank.
- 3One hour to walk it through together.
Your ERP, PDM or PIM stays where it is. A file export is enough to start.
Item data enrichment →