banner

PSMarkdownTable

Last updated 

Photo Credits: Unsplash and Tech Icons

Introduction

My most controversial preference as a command-line user is probably the one I have for PowerShell over Bash. When an explanation is demanded, I typically retort with the (hyperbolic) line:

In Bash, everything's a string. In PowerShell, everything's an object.

While neither statement is fully true, I consider them representative of each language's approach.

I find that the object-oriented nature of PowerShell makes common tasks much easier, or - at the very least - much more intuitive. Not only can you build and work with complex data structures, but PowerShell offers built-in cmdlets for serialization and de-serialization, including my favorites ConvertFrom-Json, ConvertTo-Json, ConvertFrom-Csv, and ConvertTo-Csv.

This project creates a similar module for serializing to and de-serializing from Markdown tables.

It's certainly a more niche use case, and it only works for simple data structures; However, I often find myself taking notes that I'd like to be able to later read or work with programmatically. I want my data to be both structured (for easy parsing, searching, and manipulation) and pleasantly readable (i.e. not JSON, yaml, csv, etc.). The solution I've settled on - this module - allows me to record data in any de-serializable format (now including Markdown tables), then convert it to any other (such as JSON).

Examples

JSON --> PowerShell --> Markdown

Given a JSON file like the following:

Example-JSON
[
    {
        "prop2":  "a property",
        "prop1":  1,
        "prop3":  "hello"
    },
    {
        "prop2":  5,
        "prop1":  "world",
        "prop3":  "another"
    }
]

We can de-serialize the JSON using PowerShell's ConvertFrom-JSON:

De-Serialize_JSON
PS:> Get-Content .\test.json | ConvertFrom-Json | Format-Table -Property prop1, prop2, prop3

prop1 prop2      prop3
----- -----      -----
    1 a property hello
world 5          another

Once the data is de-serialized into a PowerShell array, we can re-serialize it using my module:

Serialize-to-Markdown
PS:> Import-Module .\PSMarkdownTable\PSMarkdownTable.psm1
PS:> Get-Content .\test.json | ConvertFrom-Json | ConvertTo-MdTable                         
| prop2      | prop1 | prop3   |
| ---------- | ----- | ------- |
| a property | 1     | hello   |
| 5          | world | another |

Note: At the time of writing, I have not incorporated a way to specify the column order of object properties

Markdown --> PowerShell --> CSV

Given the same data as before, we can de-serialize a Markdown table, then re-serialize into (for example) the CSV format.

Note: If jumping over the previous section, remember to import the module before running these commands.

De-Serialize_Markdown
PS:> $md = @"
| prop2      | prop1 | prop3   |
| ---------- | ----- | ------- |
| a property | 1     | hello   |
| 5          | world | another |
"@

PS:> $md | ConvertFrom-MdTable                

prop2      prop1 prop3
-----      ----- -----
a property 1     hello
5          world another

PS:> $md | ConvertFrom-MdTable | ConvertTo-Csv
#TYPE System.Management.Automation.PSCustomObject
"prop2","prop1","prop3"
"a property","1","hello"
"5","world","another"

Source Code

You can find the source code for the PowerShell module here.