Informatica PowerCenter XML workflow analyzer
Project description
informatica-analyzer
informatica-analyzer is a lightweight Python library and command-line tool for analyzing Informatica PowerCenter XML workflow exports.
It extracts workflow, session, mapping, source, target, lookup, Source Qualifier, SQL, truncate, connection, and flat-file metadata from Informatica XML files. The extracted metadata can be written as JSON and converted into CSV reports for auditing, migration analysis, documentation, and downstream automation.
Features
- Analyze Informatica PowerCenter XML export files
- Extract workflows, sessions, and mappings
- Identify source, target, and lookup objects
- Extract Source Qualifier SQL queries
- Extract Source Qualifier filters and user-defined joins
- Extract pre-SQL and post-SQL statements
- Detect target truncate settings
- Capture database and connection metadata
- Capture flat-file and reject-file metadata where available
- Generate structured JSON output
- Generate CSV reports
- Use as both a CLI tool and a Python library
- Extend with custom validation checks
Installation
Install from PyPI:
pip install informatica-analyzer
Verify the installation:
informatica-analyzer --help
Requirements
- Python 3.10 or newer
- Informatica PowerCenter XML export files
The package is intentionally lightweight and does not require a database connection.
CLI Usage
The main CLI command is:
informatica-analyzer
Analyze XML files and generate JSON and CSV output
informatica-analyzer \
--xml-glob "inputs/*.xml" \
--json-out-dir outputs/json \
--csv-out-dir outputs
This command:
- Reads all XML files matching
inputs/*.xml - Writes one JSON file per XML file into
outputs/json - Generates CSV reports in
outputs
Generate CSV reports from existing JSON files
informatica-analyzer \
--json-glob "outputs/json/*.json" \
--csv-out-dir outputs
Use this when XML extraction has already been done and you only want to regenerate CSV reports.
Analyze XML and combine with existing JSON
informatica-analyzer \
--xml-glob "inputs/*.xml" \
--json-glob "outputs/json/*.json" \
--json-out-dir outputs/json \
--csv-out-dir outputs
This is useful when you want to process new XML files and include already-generated JSON files in the final CSV reports.
Generate compact JSON
informatica-analyzer \
--xml-glob "inputs/*.xml" \
--json-out-dir outputs/json \
--compact-json
By default, JSON output is pretty-printed. Use --compact-json to reduce file size.
Explode detail rows
informatica-analyzer \
--xml-glob "inputs/*.xml" \
--json-out-dir outputs/json \
--csv-out-dir outputs \
--explode-details
By default, the detailed CSV report groups multiple source, target, lookup, and query values into one row per workflow-mapping pair.
With --explode-details, the report creates expanded rows for detailed spreadsheet analysis.
Change log level
informatica-analyzer \
--xml-glob "inputs/*.xml" \
--json-out-dir outputs/json \
--csv-out-dir outputs \
--log-level INFO
Supported log levels:
DEBUG
INFO
WARNING
ERROR
Python Library Usage
You can also use informatica-analyzer directly from Python.
Analyze one XML file
from informatica_analyzer import analyze_xml
metrics = analyze_xml("inputs/workflow_export.xml")
print(metrics["summary"])
print(metrics["workflows"])
Write metrics JSON for one XML file
from informatica_analyzer import write_metrics_json
json_path = write_metrics_json(
"inputs/workflow_export.xml",
"outputs/json/workflow_export.json",
)
print(json_path)
Analyze multiple XML files
from informatica_analyzer import analyze_xml_files
result = analyze_xml_files(
[
"inputs/workflow_export_1.xml",
"inputs/workflow_export_2.xml",
],
json_out_dir="outputs/json",
csv_out_dir="outputs",
)
print(result["json_paths"])
print(result["csv_paths"])
Generate JSON only
from informatica_analyzer import analyze_xml_files
result = analyze_xml_files(
["inputs/workflow_export.xml"],
json_out_dir="outputs/json",
csv_out_dir=None,
)
print(result["json_paths"])
Build CSV rows in memory
from informatica_analyzer import build_csv_rows_from_json
rows = build_csv_rows_from_json(
["outputs/json/workflow_export.json"]
)
workflow_mapping_counts = rows["workflow_mapping_counts"]
workflow_mapping_details = rows["workflow_mapping_details"]
workflow_mapping_count = rows["workflow_mapping_count"]
print(workflow_mapping_details[:5])
Use the extractor directly
from pathlib import Path
from informatica_analyzer import InformaticaXmlMetricsExtractor
extractor = InformaticaXmlMetricsExtractor(Path("inputs/workflow_export.xml"))
metrics = extractor.parse()
print(metrics["details_grouped_by_mapping_name"].keys())
Output Files
A typical run produces:
outputs/
├── json/
│ ├── workflow_export_1.json
│ └── workflow_export_2.json
├── workflow_mapping_counts.csv
├── workflow_mapping_details.csv
└── workflow_mapping_count.csv
JSON Output
Each XML file produces one JSON file.
Example top-level structure:
{
"input_file": "inputs/workflow_export.xml",
"summary": {},
"workflows": [],
"details_grouped_by_mapping_name": {},
"mappings": [],
"lists": {}
}
Summary
The summary block contains high-level counts:
{
"number_of_workflows": 1,
"number_of_mappings_in_workflows": 3,
"number_of_sources_in_those_mappings": 8,
"number_of_targets_in_those_mappings": 4,
"number_of_lookups_in_those_mappings": 2
}
Workflows
The workflows block contains workflow-level metadata:
[
{
"name": "wf_customer_load",
"number_of_mappings": 2,
"mapping_names": [
"m_customer_stage",
"m_customer_target"
],
"sessions": [
{
"workflow_name": "wf_customer_load",
"session_name": "s_customer_stage",
"mapping_name": "m_customer_stage"
}
]
}
]
Mapping details
The details_grouped_by_mapping_name block contains mapping-level metadata:
{
"m_customer_stage": {
"mapping_name": "m_customer_stage",
"counts": {
"sources": 1,
"targets": 1,
"lookups": 0,
"source_qualifier_sql_queries": 1,
"source_qualifier_filters": 0,
"source_qualifier_user_defined_joins": 0,
"pre_sql": 0,
"post_sql": 0,
"target_truncate_flags": 1
},
"source_table_names": ["CUSTOMER_SRC"],
"target_table_names": ["CUSTOMER_STG"],
"lookup_table_names": [],
"source_qualifier": {
"sql_queries": [],
"source_filters": [],
"user_defined_joins": [],
"details": []
},
"pre_sql": [],
"post_sql": [],
"target_truncate": []
}
}
CSV Reports
workflow_mapping_counts.csv
One row per workflow-mapping pair.
| Column | Description |
|---|---|
wf_name |
Workflow name |
mapping_name |
Mapping name |
n_source |
Number of source objects |
n_target |
Number of target objects |
n_lookup |
Number of lookup objects |
workflow_mapping_details.csv
Detailed workflow and mapping metadata.
| Column | Description |
|---|---|
wf_name |
Workflow name |
mapping_name |
Mapping name |
s_database |
Source database or connection |
s_table |
Source table |
s_flat_file_name |
Source flat-file name |
s_flat_file_path |
Source flat-file path |
t_database |
Target database or connection |
t_table |
Target table |
t_flat_file_name |
Target flat-file name |
t_flat_file_path |
Target flat-file path |
t_reject_file_name |
Target reject file name |
t_reject_file_path |
Target reject file path |
l_table |
Lookup table |
sq_query |
Source Qualifier query |
workflow_mapping_count.csv
One row per workflow.
| Column | Description |
|---|---|
workflow_name |
Workflow name |
mapping_count |
Number of unique mappings used by the workflow |
Flat-File Metadata
For mappings that use flat files, the analyzer captures flat-file metadata where available in the Informatica session metadata.
Captured fields include:
flat_file_directoryflat_file_nameflat_file_pathreject_file_directoryreject_file_namereject_file_path
Example:
{
"mapping_name": "m_customer_file_load",
"instance_name": "CUSTOMER_FILE_SRC",
"table_name": "CUSTOMER_FILE_SRC",
"object_type": "source",
"flat_file_directory": "/data/inbound/customer",
"flat_file_name": "customer.csv",
"flat_file_path": "/data/inbound/customer/customer.csv"
}
Checks
Checks are optional validation utilities that can be built on top of extracted metadata.
The package includes basic file-data checks.
Check whether a file exists and has data
from pathlib import Path
from informatica_analyzer.checks.file_data import check_file_has_data
result = check_file_has_data(Path("/data/inbound/customer/customer.csv"))
print(result.exists)
print(result.has_data)
print(result.size_bytes)
print(result.reason)
Possible result:
FileDataCheckResult(
path="/data/inbound/customer/customer.csv",
exists=True,
has_data=True,
size_bytes=2048,
reason=None,
)
Check many files
from pathlib import Path
from informatica_analyzer.checks.file_data import check_files_have_data
paths = [
Path("/data/inbound/customer/customer.csv"),
Path("/data/inbound/order/order.csv"),
]
results = check_files_have_data(paths)
for result in results:
print(result.path, result.has_data, result.reason)
Extending the Package
New validation or audit logic should be added under:
src/informatica_analyzer/checks/
For example:
checks/file_data.py
checks/source_target_files.py
checks/sql_rules.py
checks/connection_rules.py
checks/truncate_rules.py
The extractor should focus on reading Informatica XML metadata.
Checks should answer validation questions such as:
- Does the source file exist?
- Does the target file have data?
- Is truncate enabled?
- Is a connection allowed?
- Does a SQL query contain a prohibited pattern?
This keeps extraction and validation separate.
Development
Clone the repository and install in editable mode:
git clone <your-repository-url>
cd informatica-analyzer
python -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
On Windows PowerShell:
git clone <your-repository-url>
cd informatica-analyzer
python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -e ".[dev]"
Run Tests
python -m pytest -q
Run one test file:
python -m pytest tests/test_xml_utils.py -q
Project Structure
informatica-analyzer/
├── pyproject.toml
├── README.md
├── src/
│ └── informatica_analyzer/
│ ├── __init__.py
│ ├── api.py
│ ├── cli.py
│ ├── extractor.py
│ ├── models.py
│ ├── pipeline.py
│ ├── xml_utils.py
│ ├── checks/
│ │ ├── __init__.py
│ │ └── file_data.py
│ └── reporting/
│ ├── __init__.py
│ └── csv_reports.py
└── tests/
└── test_xml_utils.py
Troubleshooting
informatica-analyzer: command not found
Install the package in the current Python environment:
python -m pip install -e .
Then verify:
informatica-analyzer --help
ModuleNotFoundError: No module named 'informatica_analyzer'
You may be using a different Python environment.
Check:
which python
python -m pip --version
Then reinstall:
python -m pip install -e .
pytest: command not found
Install development dependencies:
python -m pip install -e ".[dev]"
Or install pytest directly:
python -m pip install pytest
Then run:
python -m pytest -q
Empty CSV reports
Possible causes:
- The XML export does not contain workflow metadata
- Sessions are not linked to mappings
- The XML export contains partial repository metadata
- The wrong XML files were passed to
--xml-glob
Start by inspecting the generated JSON file:
cat outputs/json/your_file.json
Check these keys:
{
"summary": {},
"workflows": [],
"details_grouped_by_mapping_name": {}
}
License
This project is licensed under the MIT License.
See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file informatica_analyzer-0.1.0.tar.gz.
File metadata
- Download URL: informatica_analyzer-0.1.0.tar.gz
- Upload date:
- Size: 24.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f5066e1762735a74cd02d80709e7bf61baba81cc0e51141ae7489de777b39c4
|
|
| MD5 |
7896815133cfc7374c5a9ea17206aa62
|
|
| BLAKE2b-256 |
f3b5a0174a1c533c1b1e1c106b8c7a655faebfc3758b6198a37cd85de69481bd
|
Provenance
The following attestation bundles were made for informatica_analyzer-0.1.0.tar.gz:
Publisher:
publish.yml on rahulbarna00/informatica-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
informatica_analyzer-0.1.0.tar.gz -
Subject digest:
0f5066e1762735a74cd02d80709e7bf61baba81cc0e51141ae7489de777b39c4 - Sigstore transparency entry: 1813786417
- Sigstore integration time:
-
Permalink:
rahulbarna00/informatica-analyzer@a47bd96ce1d1c045f7402aada07af4a40197a39f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/rahulbarna00
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a47bd96ce1d1c045f7402aada07af4a40197a39f -
Trigger Event:
release
-
Statement type:
File details
Details for the file informatica_analyzer-0.1.0-py3-none-any.whl.
File metadata
- Download URL: informatica_analyzer-0.1.0-py3-none-any.whl
- Upload date:
- Size: 22.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5700edd1a4b2baa3d80263a11dfe99facc39a6ac937c9e030b8cfce55b95d32a
|
|
| MD5 |
6a9095b79aaddeddf8ef638a3c0072f4
|
|
| BLAKE2b-256 |
acf5fd110f8aa8a7d56c983bebfed573a7e5dfce6291c74ebc171f5940712e4a
|
Provenance
The following attestation bundles were made for informatica_analyzer-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on rahulbarna00/informatica-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
informatica_analyzer-0.1.0-py3-none-any.whl -
Subject digest:
5700edd1a4b2baa3d80263a11dfe99facc39a6ac937c9e030b8cfce55b95d32a - Sigstore transparency entry: 1813786882
- Sigstore integration time:
-
Permalink:
rahulbarna00/informatica-analyzer@a47bd96ce1d1c045f7402aada07af4a40197a39f -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/rahulbarna00
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a47bd96ce1d1c045f7402aada07af4a40197a39f -
Trigger Event:
release
-
Statement type: