{"id":29572744,"url":"https://github.com/maxblee/clipivot","last_synced_at":"2025-10-12T08:32:42.859Z","repository":{"id":129134347,"uuid":"190131014","full_name":"maxblee/clipivot","owner":"maxblee","description":"A tool for creating pivot tables from the command line.","archived":false,"fork":false,"pushed_at":"2023-03-16T13:40:46.000Z","size":528,"stargazers_count":14,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-11T19:38:40.910Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxblee.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-APACHE","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,"zenodo":null}},"created_at":"2019-06-04T04:50:51.000Z","updated_at":"2025-01-31T10:28:51.000Z","dependencies_parsed_at":"2023-04-01T08:05:04.649Z","dependency_job_id":null,"html_url":"https://github.com/maxblee/clipivot","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/maxblee/clipivot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxblee%2Fclipivot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxblee%2Fclipivot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxblee%2Fclipivot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxblee%2Fclipivot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxblee","download_url":"https://codeload.github.com/maxblee/clipivot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxblee%2Fclipivot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010792,"owners_count":26084807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2025-07-19T05:11:11.199Z","updated_at":"2025-10-12T08:32:42.852Z","avatar_url":"https://github.com/maxblee.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# clipivot\n`clipivot` is a tool for creating pivot tables from the command line. It's designed to be fast and memory-efficient so it can be used to aggregate large datasets, and it's designed to be easy to use and easy to debug.\n\nThis guide below will provide you with detailed instructions for installing and using the tool. Want to see what it does without reading the documentation?\nBuild your own pivot tables using [this interactive tool](https://docs.maxblee.com/clipivot), and either download the results or copy the commands you'd run in your terminal.\n\n## Table of Contents\n* **[Installation](#installation)**\n* **[Why Pivot Tables?](#why-should-you-use-pivot-tables)**\n* **[Why `clipivot`?](#why-clipivot)**\n* **[Why shouldn't you use `clipivot`](#why-shouldnt-you-use-clipivot)**\n* **[Usage Guide](#usage-guide)**\n    - **[Basic Usage](#basic-usage)**\n    - **[Row names](#row-names)**\n    - **[Functions](#functions)**\n    - **[Sorting](#sorting)**\n    - **[Delimiters](#delimiters)**\n    - **[Headers](#headers)**\n    - **[Null values](#null-values)**\n    - **[Error handling](#error-handling)**\n    - **[Additional Information](#additional-information)**\n* **[Contributors](#contributors)**\n* **[Developer Guide](#developer-guide)**\n* **[Contact Me](#contact-me)**\n\n## Installation\nYou should be able to currently download binaries for Windows, Linux and MacOS\non the [Releases](#https://github.com/maxblee/clipivot/releases/latest)\npage of this repository.\n\nAlternatively, you can compile the program using Rust's package manager, `cargo`, using:\n\n```bash\n$ cargo install clipivot\n```\n\nOr you can download directly from source.\n\n## Why Pivot Tables?\n\nAt a basic level, pivot tables exist as a way to aggregate data\nand extract meaning from datasets.\n\nSay, for example, you have a list of salaries for employees. Each\nrecord has a unique identifier for the employee, the employee's salary,\nand the department the employee worked for. And let's say,\nbecause I'm a journalist who's often bored by employee database examples,\nthere's also a field marking whether or not the employee was recently fired.\n\nThe dataset looks like this:\n```csv\nid,was_fired,salary,department\n1,true,25000,sales\n2,true,75000,engineering\n3,false,175000,engineering\n4,true,65000,sales\n5,false,85000,sales\n```\n(You can see the file itself in `test_csvs/layoffs.csv`.)\n\nWith this data, you might want to know the number of employees\nwho were fired from the company, as well as the number employees who remain. You can do that easily with pivot tables. Here's what\nthat syntax looks like in `clipivot`:\n\n```sh\n$ clipivot count test_csvs/layoffs.csv --rows=was_fired --val=id\n```\n\nThat will print this out in your terminal:\n\n```sh\n,total\ntrue,3\nfalse,2\n```\n\nWhich tells you that three employees were fired and that two remain.\n\nIf you're familiar with SQL, you'll notice that this is similar\nto running `GROUP BY` queries. In fact, you could run the same thing\nI just did in SQL:\n\n```sql\nSELECT was_fired, COUNT(id)\nFROM my_table\nGROUP BY was_fired;\n```\n\nWhere pivot tables really provide an advantage over `GROUP BY` queries\nis in their ability to allow you to control the output columns and rows\nwith ease.\n\nIf you want to find the total salary of the employees in the `layoffs.csv` dataset, aggregated both by the department and by\nwhether or not they were fired. You could do this in SQL:\n\n```sql\nSELECT department, was_fired, SUM(salary)\nFROM my_table\nGROUP BY department, was_fired;\n```\n\nWhich will create a table like this:\n\n```csv\ndepartment,was_fired,sum\nengineering,true,75000\nengineering,false,175000\nsales,false,85000\nsales,true,90000\n```\n\nBut you might want to set the values from the `was_fired` field as columns in the output, instead of as rows. That's trickier to do in SQL.\n(I frankly don't know how to do it, but I wouldn't be surprised if it's\npossible.)\n\nWith pivot tables, however, it's easy. Here's what that syntax looks like\nin `clipivot`:\n\n```sh\n$ clipivot sum test_csvs/layoffs.csv --rows=department --cols=was_fired --val=salary\n```\n\nWhich will give you this output:\n\n```csv\n,false,true\nsales,85000,90000\nengineering,175000,75000\n```\n\nIn other words, pivot tables provide convenient and easy-to-use ways to\naggregate datasets. \n\n## Why should you use `clipivot`?\n\nIn a lot of cases, `clipivot` isn't necessarily going to be any better\nthan existing tools for creating pivot tables. In the vast majority of\ncases, you can easily do what `clipivot` does using\n[`pandas`](https://pandas.pydata.org/) in Python or using R.\nAnd in a number of cases, you can use SQL or existing CSV toolkits like\n[`csvtk`](https://github.com/shenwei356/csvtk) or [`xsv`](https://github.com/burntsushi/xsv). You can often use Excel, too, although Excel\ndoesn't offer good ways to help you document your work or sort your\npivot tables.\n\nThere are a couple of benefits to using `clipivot` over these tools, though. \n\n`clipivot` is easier to use than any CSV toolkit I'm aware of when it comes to creating pivot tables, because it's narrowly and specifically designed to create pivot tables. And it accepts input\nfrom standard input and file paths and prints to standard output,\nallowing you to pipe it into and out of other command-line programs.\n\n`clipivot` also makes it easy to perform analyses on large datasets, including datasets that exceed the RAM on your computer.\nI used the tool to analyze [the 80 GB ARCOS dataset](https://www.washingtonpost.com/graphics/2019/investigations/dea-pain-pill-database/) the Washington Post acquired on my laptop, which has 16 GB of RAM. In all, it took me about 10 minutes (with the data stored in an HDD external drive) to create a CSV of the total number of oxycodone and\nhydrocodone pills flowing into each ZIP code in the United States between 2006 and 2012. And I didn't have to change any settings to get it to work, like I would've had to in `pandas`.\n\nBeyond that, if you're already working at the command line, it can\nsimply be convenient to stay there.\n\n## Why shouldn't you use `clipivot`?\n\n`clipivot` isn't always going to be the best tool to use.\n\nCommand-line programs are necessarily harder to configure than\nlibraries in programming languages, so if you need an aggregation\nfunction that isn't supported by `clipivot`, it's going to be easier\nto use a data science library like `pandas` than it will be to configure\n`clipivot` for your use case. (As in, configuring `clipivot` will\nrequire you to make significant changes to the source code of\n`clipivot`.)\n\nAnd `clipivot` isn't designed for cleaning data. It has a limited number\nof functions that will parse your data, but the parsing is mostly useful\nfor already well-formed data.\n\n## Usage Guide\n### Basic Usage\nFor basic syntax, I recommend that you use the help message provided with the binary:\n\n```sh\n$ clipivot --help\nclipivot 0.2.0\nMax Lee \u003cmaxbmhlee@gmail.com\u003e\nA tool for creating pivot tables from the command line.\nFor more information, visit https://www.github.com/maxblee/clipivot\n\nUSAGE:\n    clipivot [FLAGS] [OPTIONS] \u003caggfunc\u003e --val \u003cvalue\u003e [--] [filename]\n\nFLAGS:\n    -A, --asc-rows      Displays the rows in sorted, ascending order (default is index order).\n    -R, --desc-cols     Display column names in sorted, descending order (default is ascending)\n    -D, --desc-rows     Displays the rows in sorted, descending order (default is index order).\n    -e                  Ignores empty/null values ('', NULL, NaN, NONE, NA, N/A)\n    -h, --help          Prints help information\n    -I, --index-cols    Display column names in index order. Defaults to sorted, ascending order.\n        --no-header     Skip the header row of the CSV file.\n    -N                  Parse values as numeric data. This is only necessary for min, max, and minmax, which can parse\n                        strings.\n    -t                  Set the delimiter of the file to a tab.\n    -V, --version       Prints version information\n\nOPTIONS:\n    -c, --cols \u003ccolumns\u003e...    The name of the column(s) to aggregate on. Accepts string fieldnames or 0-indexed fields.\n    -d, --delim \u003cdelim\u003e        The delimiter used to separate fields. Defaults to ','.\n    -F \u003cformat\u003e                The format of a date field (e.g. %Y-%m-%d for dates like 2010-09-21)\n    -r, --rows \u003crows\u003e...       The name of the index(es) to aggregate on. Accepts string fieldnames or 0-indexed fields.\n    -v, --val \u003cvalue\u003e          \n\nARGS:\n    \u003caggfunc\u003e     The function you use to run across the pivot table.\n                              - count counts the number of matching records.\n                              - countunique counts the number of unique matching records.\n                              - max returns the maximum value of the records given a specified data type.\n                              - mean returns the mean.\n                              - median returns the median value. Requires numeric data.\n                              - min returns the minimum value of the records given a specified data type.\n                              - minmax returns both the minimum and maximum values of the records, split by a\n                  hyphen.\n                              - mode returns the most commonly appearing value.\n                              - range returns the difference between the minimum and maximum values. Returns the\n                  number of days in the case of dates.\n                              - stddev returns the sample standard deviation.\n                              - sum returns the sum of the values. [values: count, countunique, max, mean, median,\n                  min, minmax, mode, range, stddev, sum]\n    \u003cfilename\u003e    The path to the file you want to create a pivot table from\n```\n\nThat should provide you with a decent overview of the usage of `clipivot`. But let me provide a little bit more information.\n\nThe basic syntax of `clipivot` is simple. Every command needs to have\na function and a values column connected to it. That values column\ntells `clipivot` which column it needs to apply an aggregation\nfunction to. \n\nIn addition, `clipivot` needs a data source. This can either be explicitly typed after the name of the function, or it can be in the form of standard input. So the following commands are all equivalent:\n\n```sh\n$ clipivot count mydata.csv --val id\n$ cat mydata.csv | clipivot count --val id\n$ clipivot count --val id \u003c mydata.csv\n```\n\nFinally, you can apply the `--cols` or `--rows` options to aggregate\nby column. If you don't pass anything to those options, you will have\none row and/or one column named \"total\" that aggregates over\nevery single value in your dataset.\n\n### Row names\n\nThere are a variety of names you can give to the `--rows`,\n`--cols`, and `--val` options. \n\nSay we have a header row that looks like this:\n\n```sh\ncol1,col2,col1,col3\n```\n\nIn order to access the first column, we can type the following things:\n\n* `col1`: This will grab the first column named `col1`\n* `0`: This will grab the first column, regardless of the name. (The numbers throughout `clipivot` are 0-indexed to conform with standards in most programming languages.)\n* `col1[0]`: This will grab the first column named `col1`\n\nIn order to access the third column, we can type the following things:\n\n* `2`: Like `0` in the above example, this will grab the third column,\nregardless of the name.\n* `col1[1]`: This will grab the second column named `col1`.\n\nFinally, for the `--rows` and `--cols` options, we can grab multiple values. There are several equivalent ways of doing this:\n\n* `--cols=col1,col2`\n* `-c=col1,col2`\n* `-c col1 -c col2`\n* `-c col1 col2`\n* `--cols col1 col2`\n\n### Functions\n\nOnce we know what columns we want to aggregate on, we need to choose a function. Different functions accept different types of data, so it's important to understand the distinction between them.\n\nAt a basic level, functions fit into three categories.\n\n#### Text Functions\n\nOne category interprets every item as text. It will validate that your text is\nvalid UTF-8 but won't do any parsing on top of that. Because of that,\nmost data you encounter *should* be able to be parsed without error if you are using one of these methods.\n\nIn case your data cannot be properly parsed by `clipivot` using one of these functions, you can change\nthe encoding of your file on most Unix-based systems by using `iconv`. (The actual process of doing so may be a bit tricky, since figuring out\nyour file encoding is tricky and inexact, but `uchardet` and `chardetect` both work pretty well in most cases.) (Note: You will\nlikely have to install `uchardet` and `chardetect`. `chardetect`\nrequires Python and can be installed using `pip`, Python's package manager. `uchardet` can be installed using Homebrew in Mac or\napt for Linux.)\n\nThe functions that parse things as text are `count` and `countunique`. You can also technically use `min`, `max`, and `minmax` to parse text,\nbut that's primarily aimed at reading through dates, so we'll talk more\nabout that later.\n\n#### Numeric Functions\n\nSome functions only parse numeric data. The following formats all work\nfor numeric data, regardless of the aggregation function:\n\n* `100`\n* `1.2`\n* `1e-6`\n* `1E-6`\n* `-1.5`\n\nHowever, currency markers like dollar signs and thousands separators\ncannot be parsed using `clipivot`. (If you want to parse those from the\ncommand line, I recommend `csvtk replace`.)\n\nThese functions are: `mean`, `median`, `stddev` (or the sample standard deviation), and `sum`.\n\nWith all of these functions, I have paid special attention to numerical\naccuracy. `sum` and `mean` both use Decimal addition in order to avoid\ntruncation errors, while `stddev` uses [a numerically stable algorithm](https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm). Furthermore, the mean and standard deviation algorithms are both tested\nagainst the [Statistical Reference Datasets](https://www.itl.nist.gov/div898/strd/univ/homepage.html) from the Nation Institute of Standards and Technology.\n\n#### Numerical *or* date functions\n\nThere are four algorithms designed to work with either numerical\ndata or with dates. They are the minimum, the maximum, minmax (which outputs the minimum and maximum separated by a hyphen) and the range.\n\nIn the case of numerical data, the definitions for these terms should\nbe obvious. The minimum refers to the smallest number in the aggregation, the maximum refers to the largest number, the range\nrefers to the difference between the minimum and the maximum, and the minmax outputs the smallest number followed by a hyphen followed by the largest number.\n\n**Note: In order to parse `min`,`max`, or `minmax` as numeric data,\nyou must type the `-N` flag.**\n\nWith dates, the minimum refers to the earliest date, so an aggregation containing\nthe dates April 1, 2019 and March 31, 2019 would have a minimum of\nMarch 31, 2019. The maximum date is then the most recent date, while\nthe range is the difference between the earliest date and the most\nrecent date, in days.\n\nIn order to parse dates as date objects, you must pass the `-F` flag, along with a specification for how your datetimes are formatted.\nThis uses the string formatting options from Rust's `chrono` crate, which can be found \n[here](https://docs.rs/chrono/0.4.9/chrono/format/strftime/index.html).\n\n### Sorting\n\nWith `clipivot`, you can choose how to sort the columns and rows of your pivot table -- by the order in which they appear,\nin ascending, alphabetic order, or in descending, alphabetic order. By default, the columns will appear in sorted\nascending error, while the rows will appear in index order. However, you can override those defaults.\n\nBy using `-A` or `--asc-rows`, the rows will appear in ascending order; by using `-D` or `--desc-rows`, they will appear in descending order. By using `-R` or `--desc-cols`, the columns will appear in descending order; by using `-I` or `--index-cols`, they will appear in the order in which they appear.\n\n### Delimiters\n\nYou can also tell `clipivot` to use something other than commas\nas a field delimiter. By default, `clipivot` will assume that files\nending with the `.tsv` or `.tab` extensions are tab-delimited,\nwhile other files are assumed to be comma-separated. However, both of those can be overridden. You can select any other \nsingle-byte UTF-8 character as a delimiter using the `-d` option, or you can use the\n`-t` flag to choose to read tabs as the file dilimiter.\n\n**Note: The file extension tool only works when `clipivot` is\ndirectly reading a file. If it is receiving tab-delimited data\nfrom standard input, you need to use the `-t` flag or the `-d`\noption.**\n\n### Headers\n\nIf you don't have a header row, you can use the `--no-header` flag\nto have `clipivot` read the first row as a record, rather than as a header line. \n\nAlternatively, if you have a header row, but it is not on the first\nline of your file, you can use `tail -n +` to have `clipivot` read everything but the nth row. For instance, if the header row of your CSV file `bad_csv.csv` is on the fifth line, you can type\n\n```sh\ntail bad_csv.csv -n +5 | clipivot countunique -v 0\n```\n\nTo count the number of unique values in the first column of your bad\nCSV file.\n\n### Null values\n\nYou can have `clipivot` ignore empty values. If you use the `-e` flag,\n`clipivot` will skip past any cells that match (case- or whitespace-insensitively) to any of these strings:\n\n* \"\": an empty string\n* \"na\"\n* \"nan\"\n* \"n/a\"\n* \"none\"\n* \"null\"\n\nAs [this article](https://www.wired.com/2015/11/null/) eloquently\nexplains, this can be overly aggressive, so you should make sure\nthis is a reasonable approach for parsing your data. In particular,\nI'd recommend spot-checking your data to see which points `clipivot`\ninterprets as null before using the `-e` flag.\n\nWhich brings me to:\n\n### Error handling\nI've tried to make error handling clear and helpful in `clipivot`.\n\nIn all, there are four errors you might wind up seeing.\n\n* The first is a simple IO error. It looks like this:\n```sh\nNo such file or directory (os error 2)\n```\nIf you see this error, it probably means you had a typo\nwhen you tried to spell the name of your file.\n\n* The second type of error you might see is a configuration error. \nConfiguration errors can take a number of forms, each of which should\nhave a detailed error message providing you with specific information\ndebugging information. One example looks like this:\n```sh\nCould not properly configure the aggregator: Column selection must be between 0 \u003c= selection \u003c 42\n```\nIf you see that error, there's a decent chance you simply forgot\nthat fields in `clipivot` are zero-indexed.\n\n* The third type of error you might see is a CSV error, from the CSV\nparsing library `clipivot` uses. Those errors look like this:\n```sh\nCSV error: record 1 (line: 2, byte: 597): found record with 4 fields, but the previous record has 1 fields\n```\nThese errors can either come because of malformed CSVs or because\nyou forgot to specify the correct delimiter (for instance, forgetting\nto use the `-t` flag when piping in a TSV file from standard input).\n\n* Finally, you might get a parsing error that looks like this:\n```sh\nCould not parse record `NA` with index 167: Failed to parse as numeric\n```\nThis can be a sign that your file has some null or empty values in it,\nor that it is not as well-formatted as you might have hoped.\n\nIt can also be a sign that `clipivot` is trying to parse your data in a different format than you expected (for instance, that it is trying to parse a bunch of strings as dates for the range function, when\nyou want it to parse everything as a number.)\n\nThese errors will all provide you with the string value of the record\n`clipivot` couldn't parse, the index of the record (where the first non-header record has an index of 0), and the type of data that it tried to parse your data into — all of which should make it easier for you to debug.\n\n(As a side note, I recommend pairing this utility with `xsv slice -i`, which prints out a row from a CSV file at a given line.)\n\n### Additional Information\n\n- `clipivot` technically allows you to parse the `min`, `max`, and `minmax` functions as strings, or text. (In fact, this is the default.) This is almost completely intended to speed up the processing of dates in formats like YYYY-MM-DD that sort alphabetically. \n- In cases where there is more than 1 true mode, the mode algorithm here simply returns the value that first reached\nthe maximum number of occurrences (so, if you have a set of values \"a, b, b, a\", it would return \"b\", because the second occurrence of \"b\" happened earlier than the second occurrence of \"a.\")\n- The standard deviation returns the *sample* standard deviation.\n\n## Contributors\n\nThe design for the sorting comes from [this issue](https://github.com/maxblee/clipivot/issues/2).\n\nThe error handling I've used here comes directly from\n[this fantastic guide to error handling in Rust](https://blog.burntsushi.net/rust-error-handling/). I've additionally\nused design components and code snippets from [`xsv`](https://github.com/BurntSushi/xsv)\nand the [`csv` crate in Rust](https://github.com/BurntSushi/rust-csv).\n\nA number of other\nguides were useful toward getting me to write code in Rust. I've tried to\ndocument all of the guides and source code that helped me develop `clipivot` in inline comments and docstrings within the source code.\n\nOther CSV toolkits also helped me design this program. The most direct\nconnection between these toolkits is probably the approach I've taken to\nparsing null values, which is directly inspired by the approach taken\nby the [`agate`](https://agate.readthedocs.io/en/1.6.1/) library\nin Python, which serves as the backbone of [`csvkit`](https://csvkit.readthedocs.io/en/latest/). \n\nAnd I'm sure there are other, subtler ways in which existing CSV\ntoolkits have inspired the design of this project. The main toolkits I use are the previously mentioned `xsv` and the excellent [`csvtk`](https://github.com/shenwei356/csvtk). If you're\ninterested in doing more things with CSV files from the commmand line,\nI strongly recommend them both.\n\nAnd finally, the CSV files I've used to validate the numerical accuracy\nof the mean and standard deviation functions (in `tests/test_numerical_accuracy.rs`) are from the [Statistical Reference Datasets](https://www.itl.nist.gov/div898/strd/univ/homepage.html) from the Nation Institute of Standards and Technology.\n\nOutside of the core Rust code, I used code from [this guide for uploading release assets](https://github.com/marketplace/actions/upload-a-release-asset)\nand [this template for dealing with Rust binaries](https://github.com/paskausks/rust-bin-github-workflows).\n\n## Developer Guide\nIf you want to make changes to `clipivot`, I recommend you look at [the developer guide](https://docs.rs/clipivot/latest/clipivot/), which provides an overview of the design of the code along with some suggestions of things I'd like to see\nimproved. The guide is designed to allow people with no coding experience,\npeople who have written code but haven't written any Rust, and people who\nhave written code in Rust to help. So don't by any means feel like you're not\nqualified to improve this project. \n\n## Contact Me\nIf you have any questions about `clipivot` or if you have identified any bugs in the program or you want\nto contribute to it, please send me an email at maxbmhlee@gmail.com or contact me through Twitter. \nI'm [@maxblee](https://twitter.com/maxblee). And if you wind up using `clipivot` in any of your projects,\nI'd love to know.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxblee%2Fclipivot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxblee%2Fclipivot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxblee%2Fclipivot/lists"}