2016-05-07 51 views
0

test.csv文件有:如何使用Node.js将CSV文件转换为JSON脚本?

"Id","UserName","Age" 
"01","Sam Smith","33" 
"02","Fred Frankly","44" 
"03","Zachary Zupers","55" 

acpected输出:作为JSON文件

[{"id":01,"User Name": " Sam Smith", "Age":"33"}, 
{"id":03,"User Name": " Fred Frankly", "Age":"44"} 
{"id":03,"User Name": "Aachary Zupers", "Age":"55"} 
] 

我试图解决这样的了解如何使用Node.js

var fs = require("fs"); 

var data = fs.readFileSync('test.csv'); 
var stringData=data.toString(); 

console.log(stringData); 
var arrayOne= stringData.split('\r\n'); 

var header=arrayOne[0].split(','); 
var noOfRow=arrayOne.length; 
var noOfCol=header.length; 

var jArray=[]; 

var i=0,j=0; 
for (i = 1; i < noOfRow-1; i++) { 

    for (j = 0; j< noOfCol; j++) { 

     var myNewLine=arrayOne[i].split(','); 
     jArray.push('{'+header[j]+':'+myNewLine[j]+'}');    
    }; 
}; 

console.log(jArray); 

这是我输出得到了当我运行上面的代码: output Image 在上面的代码中,我刚才想的JSON脚本来显示。但是,如果你能做到这一点。请提供代码将显示的输出转换为.json文件。

请帮助我,我应该感谢你。

+0

https://www.npmjs.com/search?q=csv%20to%20json – Shanoor

回答

1

正如杉杉提到的,你可以利用这个外部库在真实项目,但我做了一些修改,你的代码是应该做的,你这样做是作为一个学习的经验,你想在什么样的情况下。

我试图保持代码的大致相同。有两个主要变化。首先,我不是创建一个包含内容的字符串,而是创建一个存储您感兴趣的每行数据的对象。由于此对象位于每行级别,因此它位于处理行的外部循环中。其次,我删除标题和值文本(引号)的第一个和最后一个字符。由于您将CSV字符串作为字符串进行分解并基于此字符串进行分割,因此它仍包含引号。在现实世界中你可能想用正则表达式或替换功能来提取这一点,但我试图保持它简单,所以它使用字符串代替。

下面的代码:

var fs = require("fs"); 

var data = fs.readFileSync('test.csv'); 
var stringData=data.toString(); 

console.log(stringData); 
var arrayOne= stringData.split('\r\n'); 

var header=arrayOne[0].split(','); 
var noOfRow=arrayOne.length; 
var noOfCol=header.length; 

var jArray=[]; 

var i=0,j=0; 
for (i = 1; i < noOfRow-1; i++) { 

    var obj = {}; 
    var myNewLine=arrayOne[i].split(','); 

    for (j = 0; j< noOfCol; j++) { 
     var headerText = header[j].substring(1,header[j].length-1); 
     var valueText = myNewLine[j].substring(1,myNewLine[j].length-1); 
     obj[headerText] = valueText; 
    }; 
    jArray.push(obj); 
}; 

console.log(jArray); 
+0

这个代码打印3每行的行数。你能修这个吗?我也试图解决这个问题。 – Neo

+0

呃,固定。说实话,我没有注意到,因为这也是原来的。您需要将jArray.push(obj)行拖出到外部循环中,以便插入每行发生。 – Paarth

+0

您是否知道如何将显示的数据保存到.json文件中? – Neo

1

试试这个:

...  
var jArray=[]; 

var i=0,j=0; 
for (i = 1; i < noOfRow-1; i++) { 

    for (j = 0; j< noOfCol; j++) { 

     var myNewLine=arrayOne[i].split(','); 
     jArray.push(JSON.parse('{'+header[j]+':'+myNewLine[j]+'}')); 
    }; 
}; 



fs.writeFile('test.json', JSON.stringify(jArray), function (err) { 
    if (err) return console.log(err); 
    console.log('ok'); 
}); 

console.log(jArray); 
1

这应该工作

var fs = require('fs'); 

var data = fs.readFileSync('test.csv'); 
var parsed = data.toString().split('\r\n').splice(1).map(function(d) { 
    var splitted = d.split(','); 
    return { 
     id: parseInt(JSON.parse(splitted[0])), 
     user_name: JSON.parse(splitted[1]), 
     age: parseInt(JSON.parse(splitted[2])) 
    }; 
}); 

console.log(parsed); 
+0

您的解决方案假定ID,User_name和年龄是常数。我不认为这是一个安全的假设。 – Paarth

0

如果你关心不重新发明轮子,

鉴于一个csv如

NAME, AGE 
Daffy Duck, 24 
Bugs Bunny, 22 

你可以做这样的

var csv = require('csv-parser') 
var fs = require('fs') 

fs.createReadStream('some-csv-file.csv') 
    .pipe(csv()) 
    .on('data', function (data) { 
    console.log('Name: %s Age: %s', data.NAME, data.AGE) 
    }) 

看到更多here