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(); | ||
|  | } |