Skip to content

Column mapping guide ​

swao service init needs to know which spreadsheet column holds which piece of information. There are two ways to tell it.

Option 1: let SWAO detect the columns from the header row ​

If the header row (row 1 of each sheet) uses recognised names, no configuration is needed. SWAO compares the headers case-insensitively, with surrounding spaces removed and runs of whitespace read as one space, in two passes:

  1. Exact match. A header that equals a recognised name is mapped first.
  2. Prefix match. For fields that are still unmapped, a header that starts with a recognised name followed by a space or one of the characters ( [ : / , ; . is mapped as well. For example, OS according to the configuration file maps to os, and AMS Sovereign Cloud Ja / Nein maps to ams_sovereign_cloud. OSI layer does not match os, and Migrationsprojekt does not match migration.

Each column feeds at most one field. A sheet without an identity column (none of the id headers) is skipped with a warning.

FieldRecognised headersStored in apps/<id>/.swao.yml
idApp ID, VM, ID, Server, Hostnameapp_id
nameApp Name, Application, Anwendung, Nameapp_name
vendor_nameVendor, Hersteller, Manufacturervendor.name
vendor_versionVersionvendor.version
vendor_urlVendor Website, URL, Websitevendor.url
vendor_typeAssessment Type, Vendor Typevendor_type
vendor_support_activeVendor Support Activevendor.support_active
contract_expiryContract Expiry, Vertragsendevendor.contract_expiry
osOS, Operating System, Betriebssystemplatform.os
os_eolOS Support Statusplatform.os_eol
active_memory_mbActive Memory (MB), Active Memory, Aktiver Speicherhardware.active_memory_mb
memory_mbMemory (MB), Memory, RAM (MB), RAM, Arbeitsspeicherhardware.memory_mb
cpu_coresCPU Cores, CPUs, CPU, vCPU, vCPUshardware.cpu_cores
disk_countDisks, Disk Counthardware.disk_count
total_disk_mibTotal Disk Capacity MiB, Total Disk (MiB), Disk Capacity MiBhardware.total_disk_mib
total_disk_gbTotal Disk (GB), Disk (GB), Total Disk Capacity GBhardware.total_disk_gb
ipIP, IP Address, IP-Adressenetwork.ip
network_zoneNetwork Zonenetwork.zone
auth_methodAuthenticationplatform.auth_method
backup_enabledBackup / DR, Backupplatform.backup_enabled
sla_uptimeSLA Uptime (%), SLA Uptimeplatform.sla_uptime
business_domainDepartment, Fachbereichbusiness.domain
business_functionFunction, App-Funktion, App Funktionbusiness.function
user_countUser Countbusiness.user_count
criticalityCriticalitybusiness.criticality
annual_cost_eurAnnual Cost (EUR), Annual Costbusiness.annual_cost_eur
license_typeLicense Type, Licence Typebusiness.license_type
health_dataContains Health Datadata.health_data
data_piiContains Personal Data (PII), Contains Personal Datadata.pii
data_subjectsData Subjectsdata.subjects
data_categoriesData Categoriesdata.categories
data_classificationData Classificationdata.classification
data_residencyData Residencydata.residency
subprocessorsSub-processors, Subprocessorsdata.subprocessors
gdpr_art9GDPR Art.9 Health Data, GDPR Art.9data.gdpr_art9
hipaa_phiHIPAA PHIdata.hipaa_phi
regulatoryRegulatory Obligationsdata.regulatory
mdr_classMDR / IVDR Classification, MDR Classdata.mdr_class
migration_candidateMigration Candidate, Migrationdisposition.migration_candidate
migration_project_vendorMigrationsprojekt mit Hersteller, Migration Project with Vendor, Vendor Migration Projectdisposition.migration_project_vendor
ams_sovereign_cloudAMS Sovereign Clouddisposition.ams_sovereign_cloud
gartner_timeGartner TIMEdisposition.gartner_time
last_audit_dateLast Security Auditsecurity.last_audit_date
integrations_rawIntegration Dependencies, Integrations, KIS-Anbindung, KIS Anbindung, Schnittstellenintegrations

The list fields data_subjects, data_categories, subprocessors, and regulatory are split on ,, and business_domain on /.

Headers that look like personal data are always PII columns, whatever else they would match: headers containing phone, Telefon, Telefonnummer, Tel, mobile, Mobil, e-mail, email, mail, contact, Kontakt, or Ansprechpartner, and the header Hersteller Support. Their values are never stored: SWAO records only whether a value is present (support_contact_present, support_phone_present, support_email_present in the vendor block). This check runs before the field matching, so Hersteller Support never becomes the vendor name.

When the sheet has an ID column but no separate name column (none of the name headers), the ID column is read as the combined ID (Name) notes form; see How SWAO reads the identity cell.

After swao service init, the summary shows per sheet which columns were recognised, and warns when the operating system, the app name, or the vendor is missing, because research needs them:

text
  Columns (Inventory, header detection): 5 recognised: id_name_combined A, os B, cpu_cores C, memory_mb D, integrations_raw E
  [warn] Not in the intake: vendor name (CVE research). Add the column (or a column map) for better research, or fill the values in apps/<id>/.swao.yml.

How SWAO reads the identity cell ​

The identity column holds the app ID and often more: a name in brackets, an operational flag, or free-text notes. SWAO applies the same rules to a combined ID (Name) notes cell (id_name_combined) and to a separate ID column (id):

  • App ID: the text before the first ( (or the split_on character), cut at the first operational flag phrase and at a dash with a space on both sides. The remaining words stay part of the ID, so FILESRV 2020 becomes filesrv-2020 and stays distinct from FILESRV (Linux Fileserver), which becomes filesrv.
  • Folder-safe form: lower case; ä, ö, ü, and ß become ae, oe, ue, and ss; every other character outside a-z, 0-9, ., _, and - becomes a dash; runs of dashes collapse into one; leading and trailing dashes are removed.
  • App name: the text inside the brackets, up to the last ), cut before a flag phrase; URL-encoded characters such as %2f are decoded. Without brackets the name is empty. A mapped name column takes precedence.
  • Notes: text after the closing bracket or after a flag phrase never reaches the ID or the name, because notes can name a member of staff.
  • Operational flag: the first flag phrase anywhere in the cell, including inside the brackets, sets disposition.operational_status. Matching ignores case.
Phrase in the cellOperational status
nicht starten & nicht löschen (also with und, or written loeschen)restricted (keep, do not start)
Alt Abgeschaltet, decommissioneddecommissioned
Ungenutzte Ressource (also when followed by Nicht starten)unused
nicht starten or nicht löschen on its ownrestricted

A row without a flag is active, or inactive when its memory or active memory is 0. Apps that are decommissioned, unused, or inactive are classified Eliminate; restricted apps are not.

CellApp IDApp nameOperational status
HOSAPP133 (Imaging Viewer)hosapp133Imaging Vieweractive
HOSAPP145 (Archive4) NICHT LÖSCHEN ...hosapp145Archive4restricted
HOSAPP146 (Old Archive) Alt Abgeschaltethosapp146Old Archivedecommissioned
HOSAPP051 (Spare VM) Ungenutzte Ressource. Nicht startenhosapp051Spare VMunused
HOSAPP047 (Spare nicht starten)hosapp047Sparerestricted
FILESRV 2020filesrv-2020(empty)active
HOSAPP200 - Imaging Routerhosapp200(empty)active
Prüf-Serverpruef-server(empty)active

If a newer SWAO version derives the IDs differently from an earlier scaffold, swao service init lists the existing service apps that the intake no longer produces and leaves them untouched. Delete those app folders, or scaffold into a fresh workspace.

Option 2: provide a column map ​

For any other layout, write a column map YAML file. Pass it with --mapping, or place it next to the workbook in wsp/inputs/service-intake/ (for example as column-map.yaml): when --from is omitted and exactly one such file exists, swao service init uses it automatically.

bash
swao service init --from server-list.xlsx --mapping column-map.yaml

Template for an export whose first column combines ID, name, and notes (for example HOSAPP145 (Archive4) NICHT LÖSCHEN ...). The header names in note: are for orientation only; SWAO maps by column letter. Adjust the letters to your sheet and delete the lines for columns you do not have, but keep the identity and os:

yaml
# wsp/inputs/service-intake/column-map.yaml
version: "1.0"
source:
  sheet: 1                # sheet name or 1-based number; default: every sheet
  header_row: 1
  data_start_row: 2
fields:
  # Column A "Server (Application)": ID before "(", name inside the brackets
  id_name_combined:    { col: A, split_on: "(", strip_closing: ")", strip_flags: true }
  os:                  { col: B, note: "Operating System / Betriebssystem" }
  vendor_name:         { col: C, note: "Vendor / Hersteller" }
  vendor_version:      { col: D, note: "Version" }
  cpu_cores:           { col: E, type: integer, note: "vCPU" }
  memory_mb:           { col: F, unit: mb, note: "Memory (MB) / Arbeitsspeicher" }
  active_memory_mb:    { col: G, unit: mb, note: "Active Memory (MB) / Aktiver Speicher" }
  total_disk_gb:       { col: H, unit: gb, note: "Disk (GB) / Festplatte (GB)" }
  integrations_raw:    { col: I, multi_value_separator: ",", note: "Integrations / Schnittstellen" }
  business_domain:     { col: J, multi_value_separator: "/", note: "Department / Fachbereich" }
  business_function:   { col: K, note: "Function / Funktion" }
  migration_candidate: { col: L, true_values: ["Yes", "Ja"], false_values: ["No", "Nein"], note: "Migration candidate / Migrationskandidat" }
pii_columns:              # values reduced to true/false, never stored
  - { col: M, reason: support_contact }
  - { col: N, reason: support_phone }
  - { col: O, reason: support_email }

Field options ​

OptionMeaning
colColumn letter (A to AZ) or 1-based column number
requiredDocuments that the column is expected; accepted for readability, not enforced per cell (rows without an identity are always skipped with a SCAFFOLD.MANDATORY_FIELD_MISSING signal)
typestring, integer, number, boolean, or list (defaults per field)
unitmb, mib, or gb for capacity columns; values such as 16 GB are converted
true_values, false_values, null_valuesWords that mean yes, no, or empty in your sheet
multi_value_separatorSplit one cell into a list (list fields)
split_onSeparator between ID and name in a combined identity cell
strip_closing, strip_flagsClean combined identity cells: remove a closing character, and strip operational status flags (on by default; the flag is still used to set the operational status)
app_id_patternFor integrations_raw: regular expression that recognises app IDs among the cell tokens (other text is kept as integration notes)
noteFree text for your own documentation

Rules SWAO enforces ​

  • An identity is mandatory: map either id_name_combined, or id (optionally with name), not both.
  • os is mandatory in a custom map: it drives the end-of-life research, the most valuable signal per row.
  • A column listed in pii_columns cannot also be mapped to a field.
  • Unknown field names are rejected with the list of supported fields.
  • Headers that look like personal data but are not declared in pii_columns produce a warning; swao health-check probe 17 reports them as well.

Supported fields ​

id_name_combined, id, name, vendor_type, vendor_name, vendor_version, vendor_url, vendor_support_active, contract_expiry, os, os_eol, auth_method, backup_enabled, sla_uptime, cpu_cores, memory_mb, active_memory_mb, disk_count, total_disk_mib, total_disk_gb, ip, network_zone, integrations_raw, business_function, business_domain, user_count, criticality, annual_cost_eur, license_type, health_data, data_pii, data_subjects, data_categories, data_classification, data_residency, subprocessors, gdpr_art9, hipaa_phi, regulatory, mdr_class, migration_candidate, gartner_time, migration_project_vendor, ams_sovereign_cloud, last_audit_date.

Which columns matter most ​

PriorityColumnsWhy
MandatoryApp ID (and name)Without an identity no app folder can be created
Strongly recommendedOperating system, migration candidate, vendorEnd-of-life research, TIME classification, CVE research
RecommendedCPU, memory, disks, integrations, department, business functionCloud cost estimate, integration graph, grouping, research context
OptionalIP, URL, migration project, sovereign cloud programme flagNetwork context, strategic context

Where the mapping is recorded ​

The workspace .swao.yml keeps a service_portfolio: block with the source file, the column map path, header names per sheet, the PII column letters, and the cluster threshold. It contains header names only, never cell values. Each app's .swao.yml also lists in intake.fields which fields the layout mapped; SWAO_APM uses this list to tell an empty value from a missing column.