95 lines
2.4 KiB
JavaScript
Executable File
95 lines
2.4 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const { EOL } = require('os')
|
|
const minimist = require('minimist')
|
|
const { Transform } = require('stream');
|
|
const fs = require('fs')
|
|
const csv = require('../')
|
|
const pkg = require('../package.json')
|
|
|
|
const argv = minimist(process.argv, {
|
|
alias: {
|
|
c: 'skipComments',
|
|
e: 'escape',
|
|
h: 'headers',
|
|
o: 'output',
|
|
q: 'quote',
|
|
l: 'skipLines',
|
|
s: 'separator',
|
|
v: 'version'
|
|
},
|
|
default: {
|
|
e: '"',
|
|
q: '"',
|
|
s: ','
|
|
},
|
|
boolean: ['version', 'help']
|
|
})
|
|
|
|
const [,, filename] = argv._
|
|
|
|
if (argv.version) {
|
|
console.log(pkg.version)
|
|
process.exit(0)
|
|
}
|
|
|
|
if (argv.help || (process.stdin.isTTY && !filename)) {
|
|
console.error(`Usage: csv-parser [filename?] [options]
|
|
--escape,-e Set the escape character (defaults to quote value)
|
|
--headers,-h Explicitly specify csv headers as a comma separated list
|
|
--help Show this help
|
|
--output,-o Set output file. Defaults to stdout
|
|
--quote,-q Set the quote character ('"' by default)
|
|
--remove Remove headers from output
|
|
--separator,-s Set the separator character ("," by default)
|
|
--skipComments,-c Skip CSV comments that begin with '#'. Set a value to change the comment character.
|
|
--skipLines,-l Set the number of lines to skip to before parsing headers
|
|
--strict Require column length match headers length
|
|
--version,-v Print out the installed version
|
|
`)
|
|
process.exit(1)
|
|
}
|
|
|
|
let input
|
|
const output = (argv.output && argv.output !== '-') ? fs.createWriteStream(argv.output) : process.stdout
|
|
const options = {
|
|
separator: argv.separator,
|
|
strict: argv.strict,
|
|
skipComments: argv.skipComments,
|
|
skipLines: argv.skipLines
|
|
}
|
|
|
|
if (argv.headers) {
|
|
options.headers = argv.headers.toString().split(argv.separator)
|
|
}
|
|
|
|
if (argv.remove) {
|
|
const removeHeaders = argv.remove.split(',')
|
|
options.mapHeaders = (name, i) => {
|
|
return removeHeaders.indexOf(name) === -1 ? name : null
|
|
}
|
|
}
|
|
|
|
if (filename === '-' || !filename) {
|
|
input = process.stdin
|
|
} else if (fs.existsSync(filename)) {
|
|
input = fs.createReadStream(filename)
|
|
} else {
|
|
console.error(`File: ${filename} does not exist`)
|
|
process.exit(2)
|
|
}
|
|
|
|
const serialize = () => {
|
|
return new Transform({
|
|
objectMode: true,
|
|
transform(obj, enc, cb) {
|
|
cb(null, JSON.stringify(obj) + EOL)
|
|
}
|
|
});
|
|
}
|
|
|
|
input
|
|
.pipe(csv(options))
|
|
.pipe(serialize())
|
|
.pipe(output)
|