Skip to content

Commit 6503255

Browse files
committed
add csv generator
1 parent af30fbe commit 6503255

6 files changed

Lines changed: 79 additions & 14 deletions

File tree

bin/genCsv.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env node
2+
var minimist=require("minimist");
3+
var argv=process.argv;
4+
argv.shift();
5+
argv.shift();
6+
var args=minimist(argv);
7+
var headers=["name","header1.filed1","header1.file2","description","header2.field1[]","header2.field1[]","header2.filed2"];
8+
9+
if (args.headers){
10+
headers=JSON.parse(args.headers);
11+
}
12+
var rowNum=args.row?args.row:10000;
13+
var chars=args.chars?args.chars:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
14+
var maxLength=parseInt(args.max?args.max:"15");
15+
console.log(headers.join(","));
16+
for (var i=0;i<rowNum;i++){
17+
var row=[];
18+
for (var j=0;j<headers.length;j++){
19+
row.push(genWord());
20+
}
21+
console.log(row.join(","));
22+
}
23+
24+
25+
function genWord(){
26+
var len=Math.round(Math.random()*maxLength);
27+
var rtn="";
28+
for (var i=0;i<len;i++){
29+
var pos=Math.round(Math.random()*chars.length);
30+
rtn+=chars[pos];
31+
}
32+
return rtn;
33+
}

libs/core/Converter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ var utils = require("./utils.js");
1010
var async = require("async");
1111

1212
function Converter(params) {
13-
Transform.call(this); //TODO what does this do? -->This calls the constructor of Transform and initialise anything the Transform needs.(like var initialisation)
13+
Transform.call(this,{
14+
highWaterMark:1024
15+
}); //TODO what does this do? -->This calls the constructor of Transform and initialise anything the Transform needs.(like var initialisation)
1416
var _param = {
1517
constructResult: true, //set to false to not construct result in memory. suitable for big csv data
1618
delimiter: ',', // change the delimiter of csv columns. It is able to use an array to specify potencial delimiters. e.g. [",","|",";"]

libs/core/defaultParsers/parser_json.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,33 @@ module.exports = {
3838
var headArr = (params.config && params.config.flatKeys) ? [fieldStr] : fieldStr.split('.');
3939
var match, index, key, pointer;
4040
//now the pointer is pointing the position to add a key/value pair.
41-
pointer = processHead(params.resultRow, headArr, arrReg, params.config && params.config.flatKeys);
41+
var pointer = processHead(params.resultRow, headArr, arrReg, params.config && params.config.flatKeys);
4242
key = headArr.shift();
4343
match = (params.config && params.config.flatKeys) ? false : key.match(arrReg);
4444
if (match) { // the last element is an array, we need check and treat it as an array.
45-
key = key.replace(match[0], '');
46-
if (!pointer[key] || !(pointer[key] instanceof Array)) {
47-
pointer[key] = [];
45+
try {
46+
key = key.replace(match[0], '');
47+
if (!pointer[key] || !(pointer[key] instanceof Array)) {
48+
pointer[key] = [];
49+
}
50+
if (pointer[key]) {
51+
index = match[1];
52+
if (index === '') {
53+
index = pointer[key].length;
54+
}
55+
pointer[key][index] = params.item;
56+
} else {
57+
params.resultRow[fieldStr] = params.item;
58+
}
59+
} catch (e) {
60+
params.resultRow[fieldStr] = params.item;
4861
}
49-
index = match[1];
50-
if (index === '') {
51-
index = pointer[key].length;
52-
}
53-
pointer[key][index] = params.item;
5462
} else {
55-
pointer[key] = params.item;
63+
if (typeof pointer=== "string"){
64+
params.resultRow[fieldStr] = params.item;
65+
}else{
66+
pointer[key] = params.item;
67+
}
5668
}
5769
}
5870
};

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@
5151
"mocha": "^2.4.5"
5252
},
5353
"dependencies": {
54-
"async": "^1.2.1"
54+
"async": "^1.2.1",
55+
"minimist": "^1.2.0"
5556
},
56-
"scripts":{
57-
"test":"mocha ./test -R spec"
57+
"scripts": {
58+
"test": "mocha ./test -R spec"
5859
}
5960
}

test/data/invalidHeader

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
header1,header1.filed1,header1.file2,header2,header2.field1[],header2.field1[],header2.filed2
2+
5OlFPc,q7,ejpJdw,DIgNVqB7h9jI,f8ayrzv,undefinedzvTY3Qd3pSkKOk,S7cVvW7m50t9U
3+
0TaUGQVPqPkOr,lT,GA,UPUuORnuaDjXdl,V6G4QFddmPH8b,65NxWPl,Lclhl0fy
4+
,ex4,1gjT4YPJ,QtJ8S5TQ,M4zO4OppCAR4,Pg7VipESqZmHwY5,mPzz
5+
FEEa,,B1B,U9,kjxHGy,McW,6FWKBP0JoCiWn
6+
0,,Fj0o9IPB,jwFuChbeqZdVVR,hGqs3Ps7dMEo6,Zundefined00Xqvw,hT7lN6iVUHDx

test/testCSVConverter2.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ describe("CSV Converter", function() {
166166
rs.pipe(conv);
167167

168168
});
169+
it ("should auto flat header if header is not valid nested json keys",function(done){
170+
var testData = __dirname + "/data/invalidHeader";
171+
var rs = fs.createReadStream(testData);
172+
var conv=new Converter();
173+
conv.on("end_parsed",function(res){
174+
assert.equal(res[0]["header1.filed1"],"q7");
175+
assert.equal(res[0]["header2.field1[]"],"undefinedzvTY3Qd3pSkKOk");
176+
done();
177+
});
178+
rs.pipe(conv);
179+
})
169180
// it ("should convert big csv",function(done){
170181
// // var rs=fs.createReadStream(__dirname+"/data/large-csv-sample.csv");
171182
// var rs=fs.createReadStream("/Users/kxiang/tmp/csvdata");

0 commit comments

Comments
 (0)