From 68759d3dba2c880a427090fa3fc36f72f3fe0c19 Mon Sep 17 00:00:00 2001 From: Guillaume Leroy Date: Mon, 7 Feb 2022 09:08:46 +0100 Subject: [PATCH] csv-to-md: read stdin if no file is provided --- README.md | 2 ++ .../markdown_table_generator.py | 31 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2a23476..220336a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ csv-to-md -s ";" -a r tests/table.csv # | Fedora | | Red Hat | csv-to-md -s ";" -a r tests/table.csv | xclip -selection clipboard # Copy markdown table in clipboard + +psql -h 127.0.0.1 -U postgres postgres -c "select * from test" --csv | csv-to-md # Generate markdown table from PostgreSQL query ``` ### Library diff --git a/markdown_table_generator/markdown_table_generator.py b/markdown_table_generator/markdown_table_generator.py index 66438f1..a6302dd 100644 --- a/markdown_table_generator/markdown_table_generator.py +++ b/markdown_table_generator/markdown_table_generator.py @@ -4,6 +4,7 @@ from enum import Enum from math import ceil, floor from typing import List, Optional +import sys class Alignment(Enum): @@ -52,7 +53,11 @@ def csv_to_md() -> None: arg_parser = ArgumentParser( description="Generate markdown table from CSV", ) - arg_parser.add_argument("file", nargs="+") + arg_parser.add_argument( + "file", + help="CSV file to convert to markdown (if empty, stdin is used)", + nargs="*", + ) arg_parser.add_argument( "-a", "--alignment", help="table alignment (l|c|r for left, center or right;default: 'l')", @@ -68,14 +73,16 @@ def csv_to_md() -> None: ) args = arg_parser.parse_args() alignment = __alignment_from_string(args.alignment) - for i, filepath in enumerate(args.file): - with open(filepath, "r", encoding="utf-8") as file: - csv = file.readlines() - table = table_from_csv(csv, args.separator, alignment) - markdown = generate_markdown(table) - print(markdown) - if i < len(args.file) - 1: - print() + if len(args.file) == 0: + csv = sys.stdin.readlines() + __print_markdown_from_csv(csv, args.separator, alignment) + else: + for i, filepath in enumerate(args.file): + with open(filepath, "r", encoding="utf-8") as file: + csv = file.readlines() + __print_markdown_from_csv(csv, args.separator, alignment) + if i < len(args.file) - 1: + print() def generate_markdown(table: Table) -> str: @@ -204,6 +211,12 @@ def __generate_dash_row(header_row: List[Optional[Cell]], columns_size: List[int return string +def __print_markdown_from_csv(csv: str, separator: str, alignment: Alignment) -> None: + table = table_from_csv(csv, separator, alignment) + markdown = generate_markdown(table) + print(markdown) + + def __generate_string_with(character: str, size: int) -> str: string = "" for _ in range(0, size):