GitHub release GitHub license Crates.io

csv2json

Turns a CSV into a JSON file

Installation:

$ cargo install csv2json

Usage:

$ csv2json --in <csv file> > <json file>

CSV Delimiter

By default, the csv is split by commas. If your csv is delimited in a different way, you can specify the character using the --delimiter or -d option

Eg: csv colon:delimited one:two Without specifying: json [ { "colon:delimited": "one:two" } ] Using -d : json [ { "colon": "one", "delimited": "two" } ]

Dimensional Seperator

If your CSV contains multidimensional data, you can add use the dimensional separator argument -d

Eg: csv name.first,name.last,age Daniel,Mason,not telling

Without using the separator: json [ { "age": "not telling", "name.first": "Daniel", "name.last": "Mason" } ]

Setting the separator -d .: json [ { "name": { "first": "Daniel", "last": "Mason" }, "age": "not telling" } ]

Arrays

You can use --arrays (or -a) with -d to break items into arrays

csv name,pets.1,pets.2 Daniel Mason,Yuki,Tinky

Without using arrays: json [ { "name": "Daniel Mason", "pets.1": "Yuki", "pets.2": "Tinky" } ]

With arrays (-d . -a): json [ { "name": "Daniel Mason", "pets": [ "Yuki", "Tinky" ] } ]

Note: The number of the key is irrelevant, it only need be a number for example:

csv name,pets.45,pets.22 Daniel Mason,,Tinky

Will produce:

json [ { "name": "Daniel Mason", "pets": [ "", "Tinky" ] } ]

Remove Empty Strings

You can remove empty strings from objects and arrays with the --remove-empty-strings flag.

Note: this happens for both objects and arrays, which may have undesirable affects.

csv name.first,name.last,age,pets.1,pets.2 daniel,,34,,

shell $ csv2json --in test.csv -d . -a --remove-empty-strings

json [ { "age": "34", "name": { "first": "daniel" }, "pets": [] } ]

Remove Empty Objects

You can remove empty objects from objects and arrays with the --remove-empty-objects flag.

Note: this happens for both objects and arrays, which may have undesirable affects.

csv name.first,name.last,pets.1.name,pets.1.type,pets.2.name,pets.2.type james,smith,,,, daniel,mason,yuki,cat,tinky,cat

shell $ csv2json --in test.csv -d . -a --remove-empty-strings --remove-empty-objects

json [ { "name": { "first": "james", "last": "smith" }, "pets": [] }, { "name": { "first": "daniel", "last": "mason" }, "pets": [ { "name": "yuki", "type": "cat" }, { "name": "tinky", "type": "cat" } ] } ]

Output to directory

Using the --out-dir <dir> to write the .json file to the output dir. It will use the name of the original file so --in /some/dir/my-data.csv --out-dir /some/other/dir will produce the file /some/other/dir/my-data.json.

Output to files based on names

Using the --out-name <template> with --out-dir <dir> to write multiple files of json using the template to generate their name from the original data. For example

Given test.csv csv name.first,name.last,pets.1.name,pets.1.type,pets.2.name,pets.2.type james,smith,suki,cat,, daniel,mason,yuki,cat,tinky,cat

Running csv2json with the following naming template shell $ csv2json --in test.csv --out-dir . --out-name "{name.first}-{name.last}" -d . -a --remove-empty-strings --remove-empty-objects

Will produce the following files

james-smith.json json { "name": { "first": "james", "last": "smith" }, "pets": [ { "name": "suki", "type": "cat" } ] } daniel-mason.json json { "name": { "first": "daniel", "last": "mason" }, "pets": [ { "name": "yuki", "type": "cat" }, { "name": "tinky", "type": "cat" } ] }

Types

Booleans

You can specify a column contains a boolean value by using the --boolean option

csv type,option.a,option.b,option.c,option.d true,1,true,anything,TRUE false,0,false,,FALSE

shell $ csv2json --in test.csv -d . --boolean option.a --boolean option.b --boolean option.c --boolean option.d [ { "option": { "a": true, "b": true, "c": true, "d": true }, "type": "true" }, { "option": { "a": false, "b": false, "c": false, "d": false }, "type": "false" } ]

Numerics

You can specify a column contains a numeric value by using the --numeric option

csv number 0 1 -1 1.0

shell $ csv2json --in test.csv --numeric number [ { "number": 0 }, { "number": 1 }, { "number": -1 }, { "number": 1.0 } ]