Microbiology report data extraction captures a culture as a nested record rather than a flat row: the specimen at the top, each organism the lab reports under it with its colony count, and under each organism a susceptibility table of drug, MIC and the printed S, I or R. Preliminary and final versions of the same culture are kept linked.
Why microbiology reports do not fit a lab result row
A microbiology report does not fit a lab result row because one culture can report several organisms, and each organism can carry its own list of drug results. A chemistry result has one test, one value and one unit. A culture has a specimen, then organisms, then drugs, so its data forms a tree rather than a line.
A flat result table has one row per test with a value, a unit, a reference range and a flag. That shape works for sodium or hemoglobin. Try to force a urine culture into it and the problems show at once. What is the test name: the culture, the organism or the drug? What is the value: the colony count, the MIC or the letter S? Which reference range applies? Every answer loses information or repeats it.
The nested shape follows the report itself. The HL7 FHIR R4 DiagnosticReport page names "a group of antibiotic isolate/sensitivities for a bacterial culture" as an example of nesting observations, and says organism sensitivities are one known use for more than two levels of nesting. The HL7 FHIR R4 Observation page describes the grouping field, hasMember, and notes that nested grouping supports a "complex micro isolate and sensitivities report". You do not need to use FHIR to borrow the idea: a culture is a parent record with child records.
Microbiology reports also change over time more than most lab results. A culture is often reported in stages as organisms grow and are identified, so the same specimen can produce two or three reports in a few days. Each stage adds detail to the tree rather than replacing a single number.
The text-heavy nature of these reports adds one more difference. Many culture findings are words, such as "No growth" or "Mixed flora", rather than numbers. Those are qualitative results, and the tour of qualitative lab results as data explains how text results are entered differently from numeric ones.
Organism and colony count fields in a culture report
Each organism in a culture report is described by a small set of fields: the organism name as printed, an isolate number that tells several organisms apart, a colony count with its unit, and any comment the lab prints beside it. Specimen fields above the organisms say what was cultured, when and under which accession number.
Specimen fields
The specimen block sits at the top of the record and applies to every organism under it. Capture:
- specimen source and type, such as urine, wound or blood, exactly as printed,
- the collection method if printed, such as clean catch or catheter,
- collection date and time and received date and time,
- the accession number,
- the culture or test name the lab prints.
The CLIA test report standard at 42 CFR 493.1291 on the eCFR lists the specimen source, when appropriate, among the items a test report must indicate. Culture reports nearly always print a source, so a missing source field usually means the extraction skipped a line. Extraction does not judge the source; it makes sure the source is captured.
Organism fields
Each organism becomes a child record of the specimen:
- Isolate number. Labs number organisms, such as 1 and 2, and use those numbers in the susceptibility table. Keep the number so drug results attach to the right organism.
- Organism name. Copy the name exactly as printed, including qualifiers such as "presumptive" or "probable". Do not expand abbreviations or correct the spelling.
- Colony count. Copy the printed quantity and its unit as text, such as ">100,000 CFU/mL" or "10,000-50,000 CFU/mL". A colony count is often a range or a greater-than value, so storing it as a single number loses meaning.
- Semi-quantitative descriptions. Some labs print words such as "Light growth" or "Many" instead of a count. Store the printed words in the same quantity field and mark them as text.
- Organism comment. Notes such as "Identification to follow" belong on the organism record.
Keep the printed form even when you also parse it. If you split ">100,000 CFU/mL" into an operator, a number and a unit, store the original string beside the parts so a reviewer can compare them.
How should an antibiotic susceptibility table be stored?
An antibiotic susceptibility table should be stored as one child row per drug per organism, each row holding the drug name, the MIC value with any operator, and the printed interpretation letter, exactly as the lab printed them. The rows hang under the organism they belong to, matched by isolate number, never under the specimen as a whole.
Susceptibility tables come in two common layouts. A single-organism table lists drugs down the side with MIC and interpretation columns. A multi-organism table lists drugs down the side and puts one pair of columns per isolate across the top. The second layout is a grid with the same pivot problem as a cumulative lab report: each cell needs both its drug and its isolate before it means anything.
Each susceptibility row needs:
- the isolate number it belongs to,
- the drug name as printed,
- the MIC as printed, including operators such as "<=" or ">=", which change its meaning if dropped,
- the MIC unit if printed,
- the interpretation exactly as printed,
- any footnote marker or comment on the row.
The interpretation column is a printed code, and extraction should copy it, not derive it. The HL7 v3 ObservationInterpretation code system groups the codes labs use for susceptibility results, including S, I and R, plus SDD for susceptible-dose dependent, NS for non-susceptible and IE for insufficient evidence. Its definitions are clinical, so this post does not restate them. For data entry, the rule is simple: store the letter the lab printed, and never fill an empty interpretation from the MIC.
A urine culture as a nested record, worked
This fictional example uses a made-up patient, Example Patient Sam Okafor, and a made-up report from a fictional lab. Every value is invented to show the structure.
Specimen record:
| Field | Example value |
|---|---|
| Accession number | EX-MB-204417 |
| Specimen source | Urine, clean catch |
| Collected | 2026-05-04 08:20 |
| Report status as printed | Final |
Organism record:
| Field | Example value |
|---|---|
| Isolate | 1 |
| Organism as printed | Escherichia coli |
| Colony count as printed | >100,000 CFU/mL |
Susceptibility rows under isolate 1:
| Drug as printed | MIC as printed | Interpretation as printed |
|---|---|---|
| Ampicillin | >=32 | R |
| Ciprofloxacin | <=0.25 | S |
| Nitrofurantoin | <=16 | S |
| Trimethoprim/Sulfamethoxazole | <=20 | S |
Three tables, one tree. Each drug row points to isolate 1, and the isolate points to the specimen. The MIC keeps its operator, and the interpretation is the printed letter. Nothing in the record says what the result means for the patient, and nothing should.
Are preliminary microbiology reports worth extracting?
Preliminary microbiology reports are worth extracting when the receiving system can hold a report status and link later versions, because they are often the first record that a culture exists. They are not worth extracting into a system that can only store one value per test, since the final report will change or replace much of what the preliminary showed.
A culture usually moves through stages. A first report may say growth was seen and identification is to follow. A later report names the organism. A final report adds the susceptibility table. Data standards describe these stages with status codes. The HL7 FHIR R4 DiagnosticReport status code system defines "partial" as a report where data "may be incomplete or unverified", "preliminary" as one where verified early results are available but not all results are final, and "final" as complete and verified by an authorized person. It also defines "appended" for content added after final release, with existing content unchanged.
Those statuses suggest a workable rule for extraction:
- Capture the status exactly as the report prints it, such as "Preliminary", "Final" or "Corrected".
- Match each new report to earlier ones by accession number and specimen.
- Treat each new version as an update to the same tree. Add organisms and drug rows that are new, and send changed values to review.
- Never let a preliminary report overwrite a final one, even if it arrives later in the mail or fax queue.
Corrected microbiology reports follow the same rule as any corrected lab result. The CLIA test report standard requires labs that detect errors in reported results to issue corrected reports and keep duplicates of both the original and corrected report, so a corrected culture should be stored next to the version it corrects, not on top of it.
If your team cannot hold versions, a simpler policy is to extract only final and corrected reports and file preliminary ones as documents. That trades early data for a cleaner record, which is a choice for the team that owns the receiving system.
Microbiology report extraction for gram stains and no-growth results
Gram stains and no-growth results are microbiology findings with no organism record underneath, and they still need to be captured. A gram stain describes what was seen under a microscope in words, and a no-growth result says the culture grew nothing. Both are stored as text results on the specimen record rather than as organisms.
Gram stain results
A gram stain is usually printed as a short block of text with descriptive words and quantities, such as an example "Moderate WBCs, Few gram-negative rods". Some labs print one line per finding, others print a single sentence. Store each printed line as its own text result under the specimen, keep the quantity words exactly as printed, and do not translate them into organism names. A gram stain line names no organism, so it should not create an organism record.
No-growth and negative results
A no-growth culture produces a text result such as "No growth at 48 hours" or "No growth". The time qualifier matters, because labs may report "No growth to date" on a preliminary report and "No growth" on the final one. Copy the full text.
The HL7 code system above includes NEG, defined as "an absence finding of the specified component / analyte, organism or clinical sign", with a note that negative does not necessarily imply complete absence. If your receiving system uses coded results, map the printed text to a code only through a reviewed mapping table, and keep the printed text alongside it.
Mixed and contaminated cultures
Some reports describe growth without naming organisms, such as "Mixed flora" or "Multiple organisms present, suggest recollection". These are text results on the specimen, not organisms. Copy them in full, including any request the lab prints, so the person reading the record sees what the lab said.
Checking before saving
Nested records still need the checks a flat result gets. Every drug row should point to an isolate number that exists. Every interpretation should be one of the codes the lab prints. A colony count should carry a unit. The guide to checking extracted lab values against units and ranges covers rules of that kind. Culture layouts differ from lab to lab, and the post on lab report formats from different labs covers planning for that.
Schema Care scores every field it reads and routes the uncertain ones to a reviewer; the Group plan lists review thresholds per document type among its features, as the pricing section shows. For how microbiology fits with other clinical paperwork, see the clinical records category.