# Xer-Reader
Read the contents of a Primavera P6 XER file using Python.
Xer-Reader makes it easy to read, parse, and convert the data in a XER file to other formats.
*Refer to the [Oracle Documentation]( https://docs.oracle.com/cd/F25600_01/English/Mapping_and_Schema/xer_import_export_data_map_project/index.htm) for more information regarding how data is mapped to the XER format.
Tested on XER files exported as versions 15.2 through 19.12.*
## Install
**Windows**:
```bash
pip install xer-reader
```
**Linux/Mac**:
```bash
pip3 install xer-reader
```
## Usage
Import the `XerReader` class from `xer_reader`.
```python
from xer_reader import XerReader
```
Create a new instance of an `XerReader` object by passing in the XER file as an argument. `XerReader` can accept the file path represented as a `str` or pathlib `Path` object, or a Binary file received as a response from requests, Flask, FastAPI, etc...
```python
file = r"/path/to/file.xer"
reader = XerReader(file)
```
### Attributes
* `data` [str] - *The contents of the XER file as a string.*
* `export_date` [datetime] - *The date the XER file was exported.*
* `export_user` [str] - *The P6 user who export the XER file.*
* `export_version` [str] - *The P6 verison used to export the XER file.*
* `file_name` [str] - *The name of the file without the '.xer' extension.*
### Methods
**`check_errors()`** -> *list[str]*
Checks the XER file for missing tables and orphan data, and returns the results as a list of errors.
* Missing tables can occur when an entry in *Table 1* points to an entry in *Table 2* but *Table 2* does not exist at all.
* Orphan data occurs when an entry in *Table 1* points to an entry *Table 2* but the entry in *Table 2* does not exist.
**`delete_tables(*table_names: str)`** -> *str*
Delete a variable number of tables (*table_names*) from the XER file data and returns a new string (*Does not modify `XerReader.data` attribute*).
In the following example the tables associated with User Defined Fields are removed from the XER file contents and stored in a new variable `new_xer_data`, which can then be written to a new XER file:
```python
new_xer_data = reader.delete_tables("UDFTYPE", "UDFVALUE")
with open("New_XER.xer", "w", encoding=XerReader.CODEC) as new_xer_file:
new_xer_file.write(new_xer_data)
```
**`get_table_names()`** -> *list[str]*
Returns a list of table names included in the XER file.
**`get_table_str(table_name: str)`** -> *str*
Returns the tab seperated text for a specific table in the XER file.
**`has_table(table_name: str)`** -> *bool*
Return True if table (`table_name`) if found in the XER file.
**`parse_tables()`** -> *dict[str, Table]*
Returns a dictionary with the table name as the key and a `Table` object as the value.
**`to_csv(file_directory: str | Path, table_names: list[str], delimeter: str)`** -> *None*
Generate a CSV file for each table in the XER file. CSV files will be created in the current working directory.
Optional `file_directory`: Pass a string or Path object to speficy a folder to store the CSV files in.
Optional `table_names`: List of tables names to save to CSV files.
Optional `delimeter`: Change the default delimeter from a `tab` to another string (e.g. a coma ",").
```python
reader.to_csv(table_names=["TASK", "PROJWBS"], delimeter=",")
```
**`to_excel()`** -> *None*
Generate an Excel (.xlsx) file with each table in the XER file on its own spreadsheet. The Excel file will be create in the
current working directory.
**`to_json(*tables: str)`** -> *str*
Generate a json compliant string representation of the tables in the XER file.
Optional: Pass in specific table names to include in the json string.
Raw data
{
"_id": null,
"home_page": "https://github.com/jjCode01/xer-reader",
"name": "xer-reader",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "primavera, p6, xer, schedule, scheduling, planning, project management, project controls",
"author": "Jesse Jones",
"author_email": "code@seqmanagement.com",
"download_url": "https://files.pythonhosted.org/packages/60/a2/9a1ce71822383a260282575a3b65d86eb9181d99492f6294bed2cce68950/xer_reader-0.4.0.tar.gz",
"platform": null,
"description": "# Xer-Reader\n\nRead the contents of a Primavera P6 XER file using Python. \n\nXer-Reader makes it easy to read, parse, and convert the data in a XER file to other formats.\n\n*Refer to the [Oracle Documentation]( https://docs.oracle.com/cd/F25600_01/English/Mapping_and_Schema/xer_import_export_data_map_project/index.htm) for more information regarding how data is mapped to the XER format. \nTested on XER files exported as versions 15.2 through 19.12.* \n\n## Install\n\n**Windows**:\n\n```bash\npip install xer-reader\n```\n\n**Linux/Mac**:\n\n```bash\npip3 install xer-reader\n```\n\n## Usage \n\nImport the `XerReader` class from `xer_reader`.\n```python\nfrom xer_reader import XerReader\n```\n\nCreate a new instance of an `XerReader` object by passing in the XER file as an argument. `XerReader` can accept the file path represented as a `str` or pathlib `Path` object, or a Binary file received as a response from requests, Flask, FastAPI, etc...\n\n```python\nfile = r\"/path/to/file.xer\"\nreader = XerReader(file)\n```\n\n### Attributes \n\n* `data` [str] - *The contents of the XER file as a string.*\n* `export_date` [datetime] - *The date the XER file was exported.*\n* `export_user` [str] - *The P6 user who export the XER file.*\n* `export_version` [str] - *The P6 verison used to export the XER file.*\n* `file_name` [str] - *The name of the file without the '.xer' extension.*\n\n### Methods\n\n**`check_errors()`** -> *list[str]* \nChecks the XER file for missing tables and orphan data, and returns the results as a list of errors. \n\n* Missing tables can occur when an entry in *Table 1* points to an entry in *Table 2* but *Table 2* does not exist at all.\n* Orphan data occurs when an entry in *Table 1* points to an entry *Table 2* but the entry in *Table 2* does not exist.\n\n**`delete_tables(*table_names: str)`** -> *str* \nDelete a variable number of tables (*table_names*) from the XER file data and returns a new string (*Does not modify `XerReader.data` attribute*). \n\nIn the following example the tables associated with User Defined Fields are removed from the XER file contents and stored in a new variable `new_xer_data`, which can then be written to a new XER file:\n```python\nnew_xer_data = reader.delete_tables(\"UDFTYPE\", \"UDFVALUE\")\n\nwith open(\"New_XER.xer\", \"w\", encoding=XerReader.CODEC) as new_xer_file:\n new_xer_file.write(new_xer_data)\n```\n\n**`get_table_names()`** -> *list[str]* \nReturns a list of table names included in the XER file. \n\n**`get_table_str(table_name: str)`** -> *str* \nReturns the tab seperated text for a specific table in the XER file.\n\n**`has_table(table_name: str)`** -> *bool* \nReturn True if table (`table_name`) if found in the XER file.\n\n**`parse_tables()`** -> *dict[str, Table]* \nReturns a dictionary with the table name as the key and a `Table` object as the value. \n\n**`to_csv(file_directory: str | Path, table_names: list[str], delimeter: str)`** -> *None* \nGenerate a CSV file for each table in the XER file. CSV files will be created in the current working directory. \nOptional `file_directory`: Pass a string or Path object to speficy a folder to store the CSV files in. \nOptional `table_names`: List of tables names to save to CSV files. \nOptional `delimeter`: Change the default delimeter from a `tab` to another string (e.g. a coma \",\"). \n\n```python\nreader.to_csv(table_names=[\"TASK\", \"PROJWBS\"], delimeter=\",\")\n```\n\n**`to_excel()`** -> *None* \nGenerate an Excel (.xlsx) file with each table in the XER file on its own spreadsheet. The Excel file will be create in the \ncurrent working directory. \n\n**`to_json(*tables: str)`** -> *str* \nGenerate a json compliant string representation of the tables in the XER file. \nOptional: Pass in specific table names to include in the json string.\n",
"bugtrack_url": null,
"license": "GPL-3.0-only",
"summary": "Read and parse a Primavera P6 xer file.",
"version": "0.4.0",
"project_urls": {
"Homepage": "https://github.com/jjCode01/xer-reader",
"Repository": "https://github.com/jjCode01/xer-reader"
},
"split_keywords": [
"primavera",
" p6",
" xer",
" schedule",
" scheduling",
" planning",
" project management",
" project controls"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7ef30f89f62947ef66ce4c092bbee8965f7750054680efb15dbb4ea694fb025e",
"md5": "59e3c0df82df8c4349720cef66399e9f",
"sha256": "ad8484ac9bf1f782c146c254f2afbc444ee87a7720a907b81cae8b64f5c0ae1b"
},
"downloads": -1,
"filename": "xer_reader-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "59e3c0df82df8c4349720cef66399e9f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 21607,
"upload_time": "2024-11-22T05:12:47",
"upload_time_iso_8601": "2024-11-22T05:12:47.393018Z",
"url": "https://files.pythonhosted.org/packages/7e/f3/0f89f62947ef66ce4c092bbee8965f7750054680efb15dbb4ea694fb025e/xer_reader-0.4.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "60a29a1ce71822383a260282575a3b65d86eb9181d99492f6294bed2cce68950",
"md5": "f0072f4a0641d59bbf34d763611f82d3",
"sha256": "a40371957c3ba27debae272eacd3b6e9b7517dc354f670f3c848e4d2cb2eb051"
},
"downloads": -1,
"filename": "xer_reader-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "f0072f4a0641d59bbf34d763611f82d3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 21622,
"upload_time": "2024-11-22T05:12:49",
"upload_time_iso_8601": "2024-11-22T05:12:49.123807Z",
"url": "https://files.pythonhosted.org/packages/60/a2/9a1ce71822383a260282575a3b65d86eb9181d99492f6294bed2cce68950/xer_reader-0.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-22 05:12:49",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jjCode01",
"github_project": "xer-reader",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "xer-reader"
}