You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					181 lines
				
				5.2 KiB
			
		
		
			
		
	
	
					181 lines
				
				5.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								function csvtojson() {
							 | 
						||
| 
								 | 
							
								  var Converter = require("../v2").Converter;
							 | 
						||
| 
								 | 
							
								  var fs = require("fs");
							 | 
						||
| 
								 | 
							
								  var options = require("./options.json");
							 | 
						||
| 
								 | 
							
								  var cmds = options.commands;
							 | 
						||
| 
								 | 
							
								  var opts = options.options;
							 | 
						||
| 
								 | 
							
								  var exps = options.examples;
							 | 
						||
| 
								 | 
							
								  var pkg = require("../package.json");
							 | 
						||
| 
								 | 
							
								  var os = require("os");
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   *{
							 | 
						||
| 
								 | 
							
								    "cmd": "parse", command to run
							 | 
						||
| 
								 | 
							
								    "options": {}, options to passe to the command
							 | 
						||
| 
								 | 
							
								    "inputStream": process.stdin // input stream for the command. default is stdin. can be a file read stream.
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								   *
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  var parsedCmd;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function _showHelp(errno) {
							 | 
						||
| 
								 | 
							
								    var key;
							 | 
						||
| 
								 | 
							
								    errno = typeof errno === "number" ? errno : 0;
							 | 
						||
| 
								 | 
							
								    console.log("csvtojson: Convert csv to JSON format");
							 | 
						||
| 
								 | 
							
								    console.log("version:", pkg.version);
							 | 
						||
| 
								 | 
							
								    console.log("Usage: csvtojson [<command>] [<options>] filepath\n");
							 | 
						||
| 
								 | 
							
								    console.log("Commands: ");
							 | 
						||
| 
								 | 
							
								    for (key in cmds) {
							 | 
						||
| 
								 | 
							
								      if (cmds.hasOwnProperty(key)) {
							 | 
						||
| 
								 | 
							
								        console.log("\t%s: %s", key, cmds[key]);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    console.log("Options: ");
							 | 
						||
| 
								 | 
							
								    for (key in opts) {
							 | 
						||
| 
								 | 
							
								      if (opts.hasOwnProperty(key)) {
							 | 
						||
| 
								 | 
							
								        console.log("\t%s: %s", key, opts[key].desc);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    console.log("Examples: ");
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < exps.length; i++) {
							 | 
						||
| 
								 | 
							
								      console.log("\t%s", exps[i]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    process.exit(errno);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  function stringToRegExp(str) {
							 | 
						||
| 
								 | 
							
								    var lastSlash = str.lastIndexOf("/");
							 | 
						||
| 
								 | 
							
								    var source = str.substring(1, lastSlash);
							 | 
						||
| 
								 | 
							
								    var flag = str.substring(lastSlash + 1);
							 | 
						||
| 
								 | 
							
								    return new RegExp(source,flag);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  function parse() {
							 | 
						||
| 
								 | 
							
								    var is = parsedCmd.inputStream;
							 | 
						||
| 
								 | 
							
								    if (parsedCmd.options.maxRowLength === undefined) {
							 | 
						||
| 
								 | 
							
								      parsedCmd.options.maxRowLength = 10240;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (is === process.stdin && is.isTTY) {
							 | 
						||
| 
								 | 
							
								      console.log("Please specify csv file path or pipe the csv data through.\n");
							 | 
						||
| 
								 | 
							
								      _showHelp(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (parsedCmd.options.delimiter === "\\t") {
							 | 
						||
| 
								 | 
							
								      parsedCmd.options.delimiter = "\t";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (parsedCmd.options.ignoreColumns) {
							 | 
						||
| 
								 | 
							
								      parsedCmd.options.ignoreColumns=stringToRegExp(parsedCmd.options.ignoreColumns);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (parsedCmd.options.includeColumns) {
							 | 
						||
| 
								 | 
							
								      parsedCmd.options.includeColumns=stringToRegExp(parsedCmd.options.includeColumns);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    var conv = new Converter(parsedCmd.options);
							 | 
						||
| 
								 | 
							
								    var isFirst = true;
							 | 
						||
| 
								 | 
							
								    conv.on("error", function (err, pos) {
							 | 
						||
| 
								 | 
							
								      if (!parsedCmd.options.quiet) {
							 | 
						||
| 
								 | 
							
								        console.error("csvtojson got an error: ", err);
							 | 
						||
| 
								 | 
							
								        if (pos) {
							 | 
						||
| 
								 | 
							
								          console.error("The error happens at following line: ");
							 | 
						||
| 
								 | 
							
								          console.log(pos);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      process.exit(1);
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								      .on("data",function (dataStr) {
							 | 
						||
| 
								 | 
							
								        process.stdout.write((isFirst ? "" : "," + os.EOL) + dataStr.toString().substr(0,dataStr.length-1));
							 | 
						||
| 
								 | 
							
								        isFirst = false;
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      .on("done", function () {
							 | 
						||
| 
								 | 
							
								        console.log(os.EOL + "]");
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								    console.log("[");
							 | 
						||
| 
								 | 
							
								    is.pipe(conv);
							 | 
						||
| 
								 | 
							
								    // is.pipe(conv);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function run(cmd, options) {
							 | 
						||
| 
								 | 
							
								    if (cmd === "parse") {
							 | 
						||
| 
								 | 
							
								      parse();
							 | 
						||
| 
								 | 
							
								    } else if (cmd === "version") {
							 | 
						||
| 
								 | 
							
								      console.log(pkg.version);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      console.log("unknown command %s.", cmd);
							 | 
						||
| 
								 | 
							
								      _showHelp(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function commandParser() {
							 | 
						||
| 
								 | 
							
								    var parsedCmd = {
							 | 
						||
| 
								 | 
							
								      "cmd": "parse",
							 | 
						||
| 
								 | 
							
								      "options": {},
							 | 
						||
| 
								 | 
							
								      "inputStream": process.stdin
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function parseObject(val, optional) {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        return JSON.parse(val);
							 | 
						||
| 
								 | 
							
								      } catch (e) {
							 | 
						||
| 
								 | 
							
								        if (optional) {
							 | 
						||
| 
								 | 
							
								          return val;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          console.error(e);
							 | 
						||
| 
								 | 
							
								          process.exit(1);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function parseBool(str, optName) {
							 | 
						||
| 
								 | 
							
								      str = str.toLowerCase();
							 | 
						||
| 
								 | 
							
								      if (str === "true" || str === "y") {
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								      } else if (str === "false" || str === "n") {
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      console.log("Unknown boolean value %s for parameter %s.", str, optName);
							 | 
						||
| 
								 | 
							
								      _showHelp(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    process.argv.slice(2).forEach(function (item) {
							 | 
						||
| 
								 | 
							
								      if (item.indexOf("--") > -1) {
							 | 
						||
| 
								 | 
							
								        var itemArr = item.split("=");
							 | 
						||
| 
								 | 
							
								        var optName = itemArr[0];
							 | 
						||
| 
								 | 
							
								        var key, val, type;
							 | 
						||
| 
								 | 
							
								        if (!opts[optName]) {
							 | 
						||
| 
								 | 
							
								          console.log("Option %s not supported.", optName);
							 | 
						||
| 
								 | 
							
								          _showHelp(1);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        key = optName.replace('--', '');
							 | 
						||
| 
								 | 
							
								        val = itemArr[1] || '';
							 | 
						||
| 
								 | 
							
								        type = opts[optName].type;
							 | 
						||
| 
								 | 
							
								        if (type === "string") {
							 | 
						||
| 
								 | 
							
								          parsedCmd.options[key] = val.toString();
							 | 
						||
| 
								 | 
							
								        } else if (type === "boolean") {
							 | 
						||
| 
								 | 
							
								          parsedCmd.options[key] = parseBool(val, optName);
							 | 
						||
| 
								 | 
							
								        } else if (type === "number") {
							 | 
						||
| 
								 | 
							
								          parsedCmd.options[key] = parseFloat(val);
							 | 
						||
| 
								 | 
							
								        } else if (type === "object") {
							 | 
						||
| 
								 | 
							
								          parsedCmd.options[key] = parseObject(val, false);
							 | 
						||
| 
								 | 
							
								        } else if (type === "~object") {
							 | 
						||
| 
								 | 
							
								          parsedCmd.options[key] = parseObject(val, true);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          throw ({
							 | 
						||
| 
								 | 
							
								            name: "UnimplementedException",
							 | 
						||
| 
								 | 
							
								            message: "Option type parsing not implemented. See bin/options.json"
							 | 
						||
| 
								 | 
							
								          });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } else if (cmds[item]) {
							 | 
						||
| 
								 | 
							
								        parsedCmd.cmd = item;
							 | 
						||
| 
								 | 
							
								      } else if (fs.existsSync(item)) {
							 | 
						||
| 
								 | 
							
								        parsedCmd.inputStream = fs.createReadStream(item);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        console.log("unknown parameter %s.", item);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    return parsedCmd;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  process.stdin.setEncoding('utf8');
							 | 
						||
| 
								 | 
							
								  parsedCmd = commandParser();
							 | 
						||
| 
								 | 
							
								  run(parsedCmd.cmd, parsedCmd.options);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								module.exports = csvtojson;
							 | 
						||
| 
								 | 
							
								if (!module.parent) {
							 | 
						||
| 
								 | 
							
								  csvtojson();
							 | 
						||
| 
								 | 
							
								}
							 |