将CSV行转换为Javascript对象
我有一个简单的csv文件 people.csv:将CSV行转换为Javascript对象,javascript,node.js,csv,Javascript,Node.js,Csv,我有一个简单的csv文件 people.csv: fname, lname, uid, phone, address John, Doe, 1, 444-555-6666, 34 dead rd Jane, Doe, 2, 555-444-7777, 24 dead rd Jimmy, James, 3, 111-222-3333, 60 alive way 我想做的是获取CSV的每一行,将其转换为JavaScript对象,将它们存储到数组中,然后将数组转换为JSON对象 server.js:
fname, lname, uid, phone, address
John, Doe, 1, 444-555-6666, 34 dead rd
Jane, Doe, 2, 555-444-7777, 24 dead rd
Jimmy, James, 3, 111-222-3333, 60 alive way
我想做的是获取CSV的每一行,将其转换为JavaScript对象,将它们存储到数组中,然后将数组转换为JSON对象
server.js:
var http = require('http');
var url = require('url');
var fs = require('fs');
var args = process.argv;
var type = args[2] || 'text';
var arr = [];
var bufferString;
function csvHandler(req, res){
fs.readFile('people.csv',function (err,data) {
if (err) {
return console.log(err);
}
//Convert and store csv information into a buffer.
bufferString = data.toString();
//Store information for each individual person in an array index. Split it by every newline in the csv file.
arr = bufferString.split('\n');
console.log(arr);
for (i = 0; i < arr.length; i++) {
JSON.stringify(arr[i]);
}
JSON.parse(arr);
res.send(arr);
});
}
//More code ommitted
var http=require('http');
var url=require('url');
var fs=需要('fs');
var args=process.argv;
var type=args[2]| |“text”;
var-arr=[];
变量缓冲字符串;
功能csvHandler(请求、回复){
fs.readFile('people.csv',函数(err,data){
如果(错误){
返回console.log(err);
}
//将csv信息转换并存储到缓冲区中。
bufferString=data.toString();
//在数组索引中存储每个人的信息。按csv文件中的每个换行将其拆分。
arr=bufferString.split('\n');
控制台日志(arr);
对于(i=0;i
我的问题是,当我调用bufferString上的.split('\n')方法时,我是否真的将该CSV行转换为Javascript对象,或者是否有其他方法可以这样做?:
arr = bufferString.split('\n');
您将拥有一个数组,其中包含所有作为字符串的行
["fname, lname, uid, phone, address","John, Doe, 1, 444-555-6666, 34 dead rd",...]
您必须使用.split(',')
再次用逗号将其打断,然后分离标题并将其推入Javascript对象:
var jsonObj = [];
var headers = arr[0].split(',');
for(var i = 1; i < arr.length; i++) {
var data = arr[i].split(',');
var obj = {};
for(var j = 0; j < data.length; j++) {
obj[headers[j].trim()] = data[j].trim();
}
jsonObj.push(obj);
}
JSON.stringify(jsonObj);
看到这个您可以尝试使用MVC Razor
<script type="text/javascript">
MyNamespace.myConfig = @Html.Raw(Json.Encode(new MyConfigObject()));
</script>
MyNamespace.myConfig=@Html.Raw(Json.Encode(新的MyConfigObject());
Encode将初始化的对象序列化为Json格式。然后,Html.Raw将阻止它将引号编码为”
在这里,您可以使用lodash(或下划线)来帮助完成这项工作
var objects = _.map(arr, function(item){return item.split(',');});
var headers = objects[0];
objects.splice(0, 1); // remove the header line
populatedObject = [];
objects.forEach(function(item){
var obj = _.zipObject(headers, item);
populatedObject.push(obj);
});
.zipObject方法会将每个标题与items数组中的每个值相匹配,并生成一个对象。使用ES6/ES7和一些函数编程准则:
- 所有变量都是常量(不变性)
- 使用
/映射
而不是减少
/,而
用于
- 所有函数都是箭头
- 无依赖项
//将数据拆分为行,并将标题与实际数据分开
//使用数组扩展算子
const[headerLine,…line]=data.split('\n');
//将标题行拆分为数组
//“valueSeparator”可能来自某种论证
//您可能希望将标题字符串转换为更多内容
//可用,如'camelCase'或'lowercase space to dash'`
常量valueSeparator='\t';
const headers=headerLine.split(valueSeparator);
//从解析行创建对象
//将有和线一样多的对象
常量对象=直线
.map((行、索引)=>
线
//使用值分隔符拆分行
.split(valueSeparator)
//将数组中的值缩减为如下对象:{[header]:value}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
.减少(
//减速机回调
(对象、值、索引)=>({
对象
[标题[索引]]:值,
}),
//初始值(空JS对象)
{}
)
);
log(“对象:”,对象);
对于使用,
作为分隔符和引号字符串值的CSV文件,可以使用以下版本:
//将数据拆分为行,并将标题与实际数据分开
//使用数组扩展算子
const[headerLine,…line]=data.split('\n');
//使用公共行分隔符,它将每一行解析为JSON数组的内容
const parseLine=(line)=>JSON.parse(`[${line}]`);
//将标题行拆分为数组
const headers=parseLine(headerLine);
//从解析行创建对象
//将有和线一样多的对象
常量对象=直线
.map((行、索引)=>
//使用JSON拆分行
解析行(行)
//将数组中的值缩减为如下对象:{[header]:value}
.减少(
(对象、值、索引)=>({
对象
[标题[索引]]:值,
}),
{}
)
);
归还物品;
注意:对于大文件,最好使用流、生成器、迭代器等。是,通过调用
split()
你正在创建一个数组,它是一个Javascript对象。你的道路命名有一些强烈的悲观情绪,来吧!谢谢你。你能解释一下第二行的确切含义吗?标题是什么意思?@GGMUarr[0]
是第一行,标题是:fname,lname,
和split(','));
使用符号,
作为删除器将字符串分解为数组。啊,明白了。谢谢。这正是我要找的。只适用于示例。如果您有不同的csv,字段中有换行符(2行地址或其他内容),它会在将框架添加到依赖列表之前,代码会很糟糕。特别是如果您只需要CSV阅读器的话。该链接现在已失效。
var objects = _.map(arr, function(item){return item.split(',');});
var headers = objects[0];
objects.splice(0, 1); // remove the header line
populatedObject = [];
objects.forEach(function(item){
var obj = _.zipObject(headers, item);
populatedObject.push(obj);
});