12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #!/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)
|