{"id":34838977,"url":"https://github.com/sumeshi/quilter-csv","last_synced_at":"2026-05-25T09:31:18.780Z","repository":{"id":239596900,"uuid":"799983348","full_name":"sumeshi/quilter-csv","owner":"sumeshi","description":"A tool that provides elastic and rapid filtering for efficient analysis of huge CSV files, such as eventlogs.","archived":false,"fork":false,"pushed_at":"2025-01-24T19:41:13.000Z","size":145,"stargazers_count":3,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-27T05:17:26.451Z","etag":null,"topics":["forensics","loganalysis","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sumeshi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-13T13:32:58.000Z","updated_at":"2025-01-24T19:29:41.000Z","dependencies_parsed_at":"2024-06-02T07:31:35.851Z","dependency_job_id":"24ae6269-5a1a-4a27-a5a6-b45ea2f8a13f","html_url":"https://github.com/sumeshi/quilter-csv","commit_stats":null,"previous_names":["sumeshi/snip-snap-csv","sumeshi/quilter-csv"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/sumeshi/quilter-csv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumeshi%2Fquilter-csv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumeshi%2Fquilter-csv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumeshi%2Fquilter-csv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumeshi%2Fquilter-csv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sumeshi","download_url":"https://codeload.github.com/sumeshi/quilter-csv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sumeshi%2Fquilter-csv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33469405,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["forensics","loganalysis","python"],"created_at":"2025-12-25T16:58:13.557Z","updated_at":"2026-05-25T09:31:18.772Z","avatar_url":"https://github.com/sumeshi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quilter-CSV\n[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)\n[![PyPI version](https://badge.fury.io/py/qsv.svg)](https://badge.fury.io/py/qsv)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/qsv)\n\n![quilter-csv](https://gist.githubusercontent.com/sumeshi/644af27c8960a9b6be6c7470fe4dca59/raw/00d774e6814a462eb48e68f29fc6226976238777/quilter-csv.svg)\n\nA tool that provides elastic and rapid filtering for efficient analysis of huge CSV files, such as eventlogs.\n\nThis project is inspired by [xsv](https://github.com/BurntSushi/xsv). We are currently developing a tool that can process hundreds of gigabytes of data, which is challenging for many tools, and apply filters according to predefined configurations.\n\n\u003e [!NOTE]  \n\u003e This project is in the early stages of development. Please be aware that frequent changes and updates are likely to occur.\n\n## Description\n### Motivation\nIn digital forensics and log analysis, it’s common to deal with extremely large CSV files—sometimes tens or even hundreds of gigabytes spread across dozens or hundreds of machines.  \nWhile many of these tasks are standardized, they often require using large, complex analysis tools with opaque specifications, or else writing intricate shell scripts that are difficult to maintain and debug.  \nThe core feature of this tool is the `quilt` command, which directly and reliably executes predefined command-line tasks.  \nWe hope this tool will serve as a solution for anyone facing similar challenges.\n\n### Architecture\nThis tool processes CSV files through three stages: an initializer, one or more chainable functions, and a finalizer.\nFor example, you can load a csv file in the initializer, use chainable functions to filter, sort, and select columns, and then output the resulting csv file in the finalizer.\n\n![](https://gist.githubusercontent.com/sumeshi/644af27c8960a9b6be6c7470fe4dca59/raw/2a19fafd4f4075723c731e4a8c8d21c174cf0ffb/qsv.svg)\n\n```bash\n$ qsv {{INITIALIZER}} {{Arguments}} - {{CHAINABLE}} {{Arguments}} - {{FINALIZER}} {{Arguments}}\n```\nEach process must be explicitly separated by a hyphen (\"-\").\n\n\n## Usage\ne.g.\nBelow is an example of reading a CSV file, extracting rows that contain 4624 in the 'Event ID' column, and displaying the top 3 rows sorted by the 'Date and Time' column.\n\n```bash\n$ qsv load Security.csv - isin 'Event ID' 4624 - sort 'Date and Time' - head 3\nshape: (3, 5)\n┌─────────────┬───────────────────────┬─────────────────────────────────┬──────────┬───────────────┐\n│ Level       ┆ Date and Time         ┆ Source                          ┆ Event ID ┆ Task Category │\n│ ---         ┆ ---                   ┆ ---                             ┆ ---      ┆ ---           │\n│ str         ┆ str                   ┆ str                             ┆ i64      ┆ str           │\n╞═════════════╪═══════════════════════╪═════════════════════════════════╪══════════╪═══════════════╡\n│ Information ┆ 10/6/2016 01:00:55 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n│ Information ┆ 10/6/2016 01:04:05 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n│ Information ┆ 10/6/2016 01:04:10 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n└─────────────┴───────────────────────┴─────────────────────────────────┴──────────┴───────────────┘\n```\n\n\n### Initializers\n#### load\nLoads the specified CSV files.\n\n| Category | Parameter  | Data Type  | Default Value | Description                                                                                |\n| -------- | ---------- | ---------- | ------------- | ------------------------------------------------------------------------------------------ |\n| Argument | path       | tuple[str] |               | The character used to separate fields within the CSV file.                                 |\n| Option   | separator  | str        | \",\"             | The character used to split values.                                                        |\n| Option   | low_memory | bool       | False         | If True, enables a lower-memory processing mode, beneficial for handling very large files. |\n\n```\n$ qsv load ./Security.csv\n```\n\n```\n$ qsv load ./logs/*.csv\n```\n\n### Chainable Functions\n#### select\nSelects only the specified columns.\n\n| Category | Parameter | Data Type              | Default Value | Description                                   |\n| -------- | --------- | ---------------------- | ------------- | --------------------------------------------- |\n| Argument | colnames  | Union[str, tuple[str]] |               | Specifies the column(s) to keep. Accepts a single column name or multiple column names. |\n\n```\n$ qsv load ./Security.csv - select 'Event ID'\n```\n\n```\n$ qsv load ./Security.csv - select \"Date and Time-Event ID\"\n```\n\n```\n$ qsv load ./Security.csv - select \"'Date and Time,Event ID'\"\n```\n\n#### isin\nFilters rows containing the specified values.\n\n| Category | Parameter | Data Type | Default Value | Description                                                                              |\n| -------- | --------- | --------- | ------------- | ---------------------------------------------------------------------------------------- |\n| Argument | colname   | str       |               | The name of the column to filter.                                                        |\n| Argument | values    | list[str] |               | A list of values to match. Rows that contain any of these values in the column are kept. |\n\n```\n$ qsv load ./Security.csv - isin 'Event ID' 4624,4634\n```\n\n#### contains\nFilters rows where the specified column matches the given regex.\n\n| Category | Parameter  | Data Type | Default Value | Description                                                          |\n| -------- | ---------- | --------- | ------------- | -------------------------------------------------------------------- |\n| Argument | colname    | str       |               | The name of the column to test against the regex pattern.            |\n| Argument | pattern    | str       |               | A regular expression pattern used for matching values in the column. |\n| Option   | ignorecase | bool      | False         | If True, performs case-insensitive pattern matching.                 |\n\n```\n$ qsv load ./Security.csv - contains 'Date and Time' '10/6/2016'\n```\n\n#### sed\nReplaces values using the specified regex.\n\n| Category | Parameter   | Data Type | Default Value | Description                                                            |\n| -------- | ----------- | --------- | ------------- | ---------------------------------------------------------------------- |\n| Argument | colname     | str       |               | The name of the column whose values will be modified.                  |\n| Argument | pattern     | str       |               | A regular expression pattern identifying substrings to replace.        |\n| Argument | replacement | str       |               | The text that replaces matched substrings.                             |\n| Option   | ignorecase  | bool      | False         | If True, the regex matching is performed in a case-insensitive manner. |\n\n```\n$ qsv load ./Security.csv - sed 'Date and Time' '/' '-'\n```\n\n#### grep\nTreats all columns as strings and filters rows where any column matches the specified regex.  \nThis function is similar to running a grep command while preserving the header row.\n\n| Category | Parameter  | Data Type | Default Value | Description                                                                     |\n| -------- | ---------- | --------- | ------------- | ------------------------------------------------------------------------------- |\n| Argument | pattern    | str       |               | A regular expression pattern used to filter rows. Any row with a match is kept. |\n| Option   | ignorecase | bool      | False         | If True, the regex match is case-insensitive.                                   |\n\n```\n$ qsv load ./Security.csv - grep 'LogonType'\n```\n\n#### head\nSelects only the first N lines.\n\n| Category | Parameter | Data Type | Default Value | Description                                   |\n| -------- | --------- | --------- | ------------- | --------------------------------------------- |\n| Option   | number    | int       | 5             | The number of rows to display from the start. |\n\n```\n$ qsv load ./Security.csv - head 10\n```\n\n#### tail\nSelects only the last N lines.\n\n| Category | Parameter | Data Type | Default Value | Description                                 |\n| -------- | --------- | --------- | ------------- | ------------------------------------------- |\n| Option   | number    | int       | 5             | The number of rows to display from the end. |\n\n```\n$ qsv load ./Security.csv - tail 10\n```\n\n#### sort\nSorts all rows by the specified column values.\n\n| Category | Parameter | Data Type                         | Default Value | Description                                               |\n| -------- | --------- | --------------------------------- | ------------- | --------------------------------------------------------- |\n| Argument | colnames  | Union[str, tuple[str], list[str]] |               | One or more columns to sort by.                           |\n| Option   | desc      | bool                              | False         | If True, sorts in descending order rather than ascending. |\n\n\n```\n$ qsv load ./Security.csv - sort 'Date and Time'\n```\n\n#### sort\nCounts duplicate rows, grouping by all columns.\n\n```\n$ qsv load ./Security.csv - count\n```\n\n#### uniq\nRemove duplicate rows based on the specified column names.\n\n| Category | Parameter | Data Type                         | Default Value | Description                                                                     |\n| -------- | --------- | --------------------------------- | ------------- | ------------------------------------------------------------------------------- |\n| Argument | colnames  | Union[str, tuple[str], list[str]] |               | Column(s) used to determine uniqueness. Rows with duplicate values are removed. |\n\n```\n$ qsv load ./Security.csv - uniq 'Event ID'\n```\n\n#### changetz\nChanges the timezone of the specified date column.\n\nThe datetime format strings follow the same conventions as [Python](https://docs.python.org/3/library/datetime.html)'s datetime module (based on the C99 standard).\n\n| Category | Parameter | Data Type | Default Value | Description                                                                                    |\n| -------- | --------- | --------- | ------------- | ---------------------------------------------------------------------------------------------- |\n| Argument | colname   | str       |               | The name of the date/time column to convert.                                                   |\n| Option   | tz_from   | str       | \"UTC\"         | The original timezone of the column's values.                                                  |\n| Option   | tz_to     | str       | \"UTC\"         | The target timezone to convert values into.                                                    |\n| Option   | dt_format | str       | AutoDetect    | The datetime format for parsing values. If not provided, the format is automatically inferred. |\n\n```\n$ qsv load ./Security.csv - changetz 'Date and Time' --timezone_from=UTC --timezone_to=Asia/Tokyo --datetime_format=\"%m/%d/%Y %I:%M:%S %p\"\n```\n\n#### renamecol\nRenames the specified column.\n\n| Category | Parameter   | Data Type | Default Value | Description                               |\n| -------- | ----------- | --------- | ------------- | ----------------------------------------- |\n| Argument | colname     | str       |               | The current name of the column to rename. |\n| Argument | new_colname | str       |               | The new name for the specified column.    |\n\n```\n$ qsv load ./Security.csv - renamecol 'Event ID' 'EventID'\n```\n\n### Finalizer\n#### headers\nDisplays the column names of the data.\n\n| Category | Parameter | Data Type | Default Value | Description                                                             |\n| -------- | --------- | --------- | ------------- | ----------------------------------------------------------------------- |\n| Option   | plain     | bool      | False         | If True, displays the column headers as plain text rather than a table. |\n\n```\n$ qsv load ./Security.csv - headers\n┏━━━━┳━━━━━━━━━━━━━━━┓\n┃ #  ┃ Column Name   ┃\n┡━━━━╇━━━━━━━━━━━━━━━┩\n│ 00 │ Level         │\n│ 01 │ Date and Time │\n│ 02 │ Source        │\n│ 03 │ Event ID      │\n│ 04 │ Task Category │\n└────┴───────────────┘\n```\n\n#### stats\nDisplays the statistical information of the data.\n\n```\n$ qsv load ./Security.csv - stats\nshape: (9, 6)\n┌────────────┬─────────────┬───────────────────────┬─────────────────────────────────┬─────────────┬─────────────────────────┐\n│ statistic  ┆ Level       ┆ Date and Time         ┆ Source                          ┆ Event ID    ┆ Task Category           │\n│ ---        ┆ ---         ┆ ---                   ┆ ---                             ┆ ---         ┆ ---                     │\n│ str        ┆ str         ┆ str                   ┆ str                             ┆ f64         ┆ str                     │\n╞════════════╪═════════════╪═══════════════════════╪═════════════════════════════════╪═════════════╪═════════════════════════╡\n│ count      ┆ 62031       ┆ 62031                 ┆ 62031                           ┆ 62031.0     ┆ 62031                   │\n│ null_count ┆ 0           ┆ 0                     ┆ 0                               ┆ 0.0         ┆ 0                       │\n│ mean       ┆ null        ┆ null                  ┆ null                            ┆ 5058.625897 ┆ null                    │\n│ std        ┆ null        ┆ null                  ┆ null                            ┆ 199.775419  ┆ null                    │\n│ min        ┆ Information ┆ 10/6/2016 01:00:35 PM ┆ Microsoft-Windows-Eventlog      ┆ 1102.0      ┆ Credential Validation   │\n│ 25%        ┆ null        ┆ null                  ┆ null                            ┆ 5152.0      ┆ null                    │\n│ 50%        ┆ null        ┆ null                  ┆ null                            ┆ 5156.0      ┆ null                    │\n│ 75%        ┆ null        ┆ null                  ┆ null                            ┆ 5157.0      ┆ null                    │\n│ max        ┆ Information ┆ 10/7/2016 12:59:59 AM ┆ Microsoft-Windows-Security-Aud… ┆ 5158.0      ┆ User Account Management │\n└────────────┴─────────────┴───────────────────────┴─────────────────────────────────┴─────────────┴─────────────────────────┘\n```\n\n#### showquery\nDisplays the data processing query.\n\n```\n$ qsv load Security.csv - showquery\nnaive plan: (run LazyFrame.explain(optimized=True) to see the optimized plan)\n\n  Csv SCAN Security.csv\n  PROJECT */5 COLUMNS\n```\n\n#### show\nDisplays the processing results in a table format to standard output.\n\n```\n$ qsv load Security.csv - show\nLevel,Date and Time,Source,Event ID,Task Category\nInformation,10/7/2016 06:38:24 PM,Microsoft-Windows-Security-Auditing,4658,File System\nInformation,10/7/2016 06:38:24 PM,Microsoft-Windows-Security-Auditing,4656,File System\nInformation,10/7/2016 06:38:24 PM,Microsoft-Windows-Security-Auditing,4658,File System\nInformation,10/7/2016 06:38:24 PM,Microsoft-Windows-Security-Auditing,4656,File System\nInformation,10/7/2016 06:38:24 PM,Microsoft-Windows-Security-Auditing,4658,File System\n```\n\n#### showtable\nOutputs the processing results table to the standard output.\n\n```\n$ qsv load Security.csv - showtable\nshape: (3, 5)\n┌─────────────┬───────────────────────┬─────────────────────────────────┬──────────┬───────────────┐\n│ Level       ┆ Date and Time         ┆ Source                          ┆ Event ID ┆ Task Category │\n│ ---         ┆ ---                   ┆ ---                             ┆ ---      ┆ ---           │\n│ str         ┆ str                   ┆ str                             ┆ i64      ┆ str           │\n╞═════════════╪═══════════════════════╪═════════════════════════════════╪══════════╪═══════════════╡\n│ Information ┆ 10/6/2016 01:00:55 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n│ Information ┆ 10/6/2016 01:04:05 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n│ Information ┆ 10/6/2016 01:04:10 PM ┆ Microsoft-Windows-Security-Aud… ┆ 4624     ┆ Logon         │\n└─────────────┴───────────────────────┴─────────────────────────────────┴──────────┴───────────────┘\n```\n\n#### dump\nOutputs the processing results to a CSV file.\n\n| Category | Parameter | Data Type | Default Value               | Description                                                                                                           |\n| -------- | --------- | --------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------- |\n| Option   | path      | str       | yyyymmdd-HHMMSS_{QUERY}.csv | The file path where the filtered/output CSV data will be saved. If not specified, a timestamp-based filename is used. |\n\n```\n$ qsv load Security.csv - dump ./Security-qsv.csv\n```\n\n\n### Quilt\nQuilt is a command-line tool that allows you to define a sequence of **Initializer**, **Chainable Functions**, and **Finalizer** processes in a YAML configuration file and execute them in a single pipeline.\n\n#### Usage\n\n| Category | Parameter | Data Type  | Default Value | Description                                                                                                 |\n| -------- | --------- | ---------- | ------------- | ----------------------------------------------------------------------------------------------------------- |\n| Argument | config    | str        |               | Path to a YAML configuration file/directory that defines initializers, chainable functions, and finalizers steps.     |\n| Argument | path      | tuple[str] |               | One or more paths to CSV files to be processed according to the predefined rules in the configuration file. |\n\n#### Command Example\n```bash\n$ qsv quilt rules/test.yaml ./Security.csv\n```\n\n#### Configuration Example\n`rules/test.yaml`\n\n```yaml\ntitle: 'test'\ndescription: 'test processes'\nversion: '0.1.0'\nauthor: 'John Doe \u003cjohn@example.com\u003e'\nstages:\n  test_stage: # arbitrary stage name\n    type: process # operation type\n    steps:\n      load: \n      isin:\n        colname: EventId\n        values:\n          - 4624\n      head:\n        number: 5\n      select:\n        colnames:\n          - RecordNumber\n          - TimeCreated\n      changetz:\n        colname: TimeCreated\n        tz_from: UTC\n        tz_to: Asia/Tokyo\n        dt_format: \"%Y-%m-%d %H:%M:%S%.f\"\n      showtable:\n```\n\nThe above configuration file defines the following sequence of operations:\n1. Load a CSV file.\n2. Filter rows where the `EventId` column contains the value `4624`.\n3. Retrieve the first 5 rows.\n4. Extract the `RecordNumber` and `TimeCreated` columns.\n5. Convert the time zone of the `TimeCreated` column from `UTC` to `Asia/Tokyo`.\n6. Display the processing results in a table format.\n\n#### Pipeline Operations\n| Operation Type | Description                                                | Parameters                                                                                                                                    |\n| -------------- | ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| process        | Executes a series of operations on the dataset.            | `steps`: A dict of operations (e.g., `load`, `select`, `dump`) to apply.                                                                      |\n| concat         | Concatenates multiple datasets vertically or horizontally. | `sources`: List of stages to concat. \u003cbr\u003e`params.how`: `vertical`, `vertical_relaxed`, `horizontal`, `diagonal`, `align`, etc.                       |\n| join           | Joins multiple datasets using keys.                        | `sources`: List of stages to join.\u003cbr\u003e`params.key`: Column(s) used for joining.\u003cbr\u003e`params.how`: `inner`, `left`, `right`, `full`, `semi`, `anti`, `cross`.\u003cbr\u003e`params.coalesce`: bool |\n\n#### Sample YAML (`rules/test.yaml`):\n```yaml\ntitle: 'test'\ndescription: 'test pipelines'\nversion: '0.1.0'\nauthor: 'John Doe \u003cjohn@example.com\u003e'\nstages:\n  load_stage:\n    type: process\n    steps:\n      load:\n\n  stage_1:\n    type: process\n    source: load_stage\n    steps:\n      select:\n        colnames: \n          - TimeCreated\n          - PayloadData1\n\n  stage_2:\n    type: process\n    source: load_stage\n    steps:\n      select:\n        colnames: \n          - TimeCreated\n          - PayloadData2\n\n  merge_stage:\n    type: join\n    sources:\n      - stage_1\n      - stage_2\n    params:\n      how: full\n      key: TimeCreated\n      coalesce: True\n  \n  stage_3:\n    type: process\n    source: merge_stage\n    steps:\n      showtable:\n```\n\n#### Note: Step Duplication\nQuilt supports YAML configurations with duplicate keys in steps.\n\n```yaml\nstages:\ntest_stage:\n  steps:\n    load:\n    renamecol: # duplicate key\n      from: old_col1\n      to: new_col1\n    renamecol: # duplicate key\n      from: old_col2\n      to: new_col2\n    renamecol: # duplicate key\n      from: old_col3\n      to: new_col3\n    show:\n```\n\nInternally, these keys are handled as:\n\n```yaml\nrenamecol\nrenamecol_\nrenamecol__\n```\n\nThis ensures that each steps is treated as a distinct operation in the pipeline.\n\n\n## Installation\n### from PyPI\n```\n$ pip install qsv\n```\n\n### from GitHub Releases\nA Nuitka-compiled binary version is also [available](https://github.com/sumeshi/quilter-csv/releases).\n\n#### Ubuntu\n```\n$ chmod +x ./qsv\n$ ./qsv {{options...}}\n```\n\n#### Windows\n```\n\u003e qsv.exe {{options...}}\n```\n\n## License\nQuilter-CSV is released under the [MIT](https://github.com/sumeshi/quilter-csv/blob/master/LICENSE) License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumeshi%2Fquilter-csv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsumeshi%2Fquilter-csv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsumeshi%2Fquilter-csv/lists"}