🔥 NODE.JS - Comparative analysis of csv converters.
In the old test method, the csv structure was passed as a string to the converters and the time that elapsed from that conversion was used for comparison:
| module | exec time (10 rows) | exec time (1000 rows) |
|---|---|---|
| csvtojsonV1.js | 46.8337 ms | 77.1661989 ms |
| csvtojsonV2.js | 9.934 ms | 24.36389 ms |
| papaparse.js | 2.5822 ms | 8.2563 ms |
| convert-csv-to-json.js | 0.58229 ms | 3.556901 ms |
| csv-parser.js | 8.917701 ms | 35.272601 ms |
| csv-parse.js | 13.1939 ms | 74.1141 ms |
| fast-csv.js | 12.8577 ms | 58.502801 ms |
In the new method, use a createReadStream to read a file then it is connected to the converter using the pipe function, the time it takes from connecting the pipe to the end event is used for the comparison.
| module | exec time (10 rows) | exec time (1k rows) | exec time (10k rows) | exec time (100k rows) |
|---|---|---|---|---|
| papaparse.js | 10.8862 ms | 22.5746 ms | 81.1833 ms | 337.1437 ms |
| csv-parser.js | 9.74559 ms | 51.86 ms | 111.473 ms | 524.9644 ms |
| csv-parse.js | 13.7337 ms | 128.0882 ms | 202.3191 ms | 848.5843 ms |
| fast-csv.js | 12.9665 ms | 57.5728 ms | 219.8584 ms | 1 s 390.5334 ms |
Obs: Some packages have not supported or demonstrated some type of bug and have been removed.
The comparator consists of modules. they are in the modules folder and maintain the following structure:
module.exports = {
name: "sample-module",
pipeConnector(stream) {
// return stream.pipe(/* stream connector */);
}
};It is possible to pass arguments to the analyzer use the --help or -h flag for more details:
node index.js --helpA very useful and important flag is the --module or just -m, it serves and is used to test each module individually:
node index.js -m papaparseIt is still possible to select an input file to perform the conversion and output path to save the result:
node index.js -m fast-csv -i ./big-data.csv -d
# or
node index.js -m fast-csv -i ./big-data.csv -o ./output.jsonThe tests were based on the 10-rows.csv, 1k-rows.csv and 10k-rows.csv file which maintains the following structure:
| _id | age | name | gender | phone | |
|---|---|---|---|---|---|
| 5e327d46d2bced0625350c64 | 20 | Kimberley Kinney | female | kimberleykinney@quarx.com | +55 (923) 451-3229 |
| 5e327d4652112a31ca1cb009 | 25 | Frieda Roth | female | friedaroth@quarx.com | +55 (928) 580-3096 |
| 5e327d4611b7676779e8706f | 31 | Bean Pope | male | beanpope@quarx.com | +55 (839) 449-2320 |
| ... | ... | ... | ... | ... | ... |
For each module tested the result obtained by converting the csv must be equal to the following structure:
[
{
_id: "5e327d46d2bced0625350c64",
age: "20",
name: "Kimberley Kinney",
gender: "female",
email: "kimberleykinney@quarx.com",
phone: "+55 (923) 451-3229"
}
// ...
];