Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将CSV行转换为Javascript对象_Javascript_Node.js_Csv - Fatal编程技术网

将CSV行转换为Javascript对象

将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:

我有一个简单的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:

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对象。你的道路命名有一些强烈的悲观情绪,来吧!谢谢你。你能解释一下第二行的确切含义吗?标题是什么意思?@GGMU
arr[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);
});