Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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/7/elixir/2.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
Javascript D3:如何将CSV字符串解析为一个对象,其中键是列名,值是数据数组?_Javascript_Arrays_Csv_D3.js - Fatal编程技术网

Javascript D3:如何将CSV字符串解析为一个对象,其中键是列名,值是数据数组?

Javascript D3:如何将CSV字符串解析为一个对象,其中键是列名,值是数据数组?,javascript,arrays,csv,d3.js,Javascript,Arrays,Csv,D3.js,我想使用D3V3.5.6将CSV字符串转换为Javascript对象,其中列名是键,数据是数组 到目前为止,我的JS: var csvString= 'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n'; var headers = [] d3.csv.parse(csvString, function(data){ headers = d3.keys(data); }); 这会用列名字符串填充数组

我想使用D3V3.5.6将CSV字符串转换为Javascript对象,其中列名是键,数据是数组

到目前为止,我的JS:

var csvString= 'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n';
var headers = []
d3.csv.parse(csvString, function(data){
  headers = d3.keys(data);
});
这会用列名字符串填充数组
标题
,但我不知道如何获取数据

我想做一个这样的物体:

{
  "date": ["1/1/16","1/3/16","1/5/16"],
  "dow": ["10","5","12"],
  ...
}
只有D3可以吗

以下是易于阅读的CSV字符串:

date,dow,sp500,nasdaq
1/1/16,10,15,8
1/3/16,5,3,7
1/5/16,12,18,12
使用下划线(这是我习惯的唯一原因,您可以使用常规的js映射/forEach)

使用下划线(这是我习惯的唯一原因,您可以使用常规的js映射/forEach)


此例程解析这些字符串的数组(假设格式一致),并将它们作为字符串数组返回,该字符串数组的格式为所需的格式。如果需要对象而不是字符串,请修改函数(我添加了注释)。你应该可以把这个输入D3

   var d3Data = splitStockStrings ( [
                    'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n',
                    'date,dow,sp500,nasdaq\n1/1/17,10,15,8\n1/3/17,5,3,7\n1/5/17,12,18,12\n'
                ] );
  console.log ( d3Data );

  function splitStockStrings ( stockStrings ) {
    var newStrings = [];

    stockStrings.forEach ( function ( d ) {             
      var final = [];
      d.split ( '\n' ).forEach ( function ( frag, i ) {
        if ( i > 0 && frag.split ( ',' ) [ 0 ] ) {
          final.push ( frag.split ( ',' ) [ 0 ] );
        }
      });

      var obj = { date : final };
      var json = JSON.stringify ( obj );
      newStrings.push ( json );
      // Or if you don't want strings,
      // comment out the above and uncomment the below...
      // newStrings.push ( obj );
    });

    return newStrings;
   }

此例程解析这些字符串的数组(假设格式一致),并将它们作为字符串数组返回,该字符串数组的格式为所需的格式。如果需要对象而不是字符串,请修改函数(我添加了注释)。你应该可以把这个输入D3

   var d3Data = splitStockStrings ( [
                    'date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n',
                    'date,dow,sp500,nasdaq\n1/1/17,10,15,8\n1/3/17,5,3,7\n1/5/17,12,18,12\n'
                ] );
  console.log ( d3Data );

  function splitStockStrings ( stockStrings ) {
    var newStrings = [];

    stockStrings.forEach ( function ( d ) {             
      var final = [];
      d.split ( '\n' ).forEach ( function ( frag, i ) {
        if ( i > 0 && frag.split ( ',' ) [ 0 ] ) {
          final.push ( frag.split ( ',' ) [ 0 ] );
        }
      });

      var obj = { date : final };
      var json = JSON.stringify ( obj );
      newStrings.push ( json );
      // Or if you don't want strings,
      // comment out the above and uncomment the below...
      // newStrings.push ( obj );
    });

    return newStrings;
   }

好的,除了d3.csv.parse(),在我看来,这个问题与d3没有什么关系,可以用纯JavaScript解决:

var csvString='date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n';
var data=d3.csv.parse(csvString);
var headers=d3.keys(数据[0]);
var myObject={};
headers.forEach(函数(d){
myObject[d]=[];
});
data.forEach(函数(d){
for(变量键在d中){
myObject[key].push(d[key]);
}
});
console.log(myObject)

好吧,除了
d3.csv.parse()

var csvString='date,dow,sp500,nasdaq\n1/1/16,10,15,8\n1/3/16,5,3,7\n1/5/16,12,18,12\n';
var data=d3.csv.parse(csvString);
var headers=d3.keys(数据[0]);
var myObject={};
headers.forEach(函数(d){
myObject[d]=[];
});
data.forEach(函数(d){
for(变量键在d中){
myObject[key].push(d[key]);
}
});
console.log(myObject)

为什么使用
常量
标识符?在您的示例中,
csv
代表什么?如果您愿意,用var替换const,它只是ES6。CSV是包含CSV数据的字符串。我将更新namingWhy
const
标识符?在您的示例中,
csv
代表什么?如果您愿意,用var替换const,它只是ES6。CSV是包含CSV数据的字符串。我会更新名称你需要D3来完成吗,或者你可以用javascript创建一个值数组,然后将它提供给D3吗?@Timconolazio我更喜欢D3,因为它可以用
D3.keys()方法轻松识别列名。但是,如果有其他方法可以得到我想要的结果,我愿意接受。看一看。@altocumulus,这很接近,但不是我想要的格式。该解决方案将CSV字符串解析为
[{“date”:“1/1/16”},{“date”:“1/3/16”}]
您需要D3来完成这项工作,还是只需要在javascript中创建值数组,然后将其提供给D3?@timconolazio我更喜欢D3,因为它很容易用
D3.keys()
方法识别列名。但是,如果有其他方法可以得到我想要的结果,我愿意接受。看一看。@altocumulus,这很接近,但不是我想要的格式。该解决方案将CSV字符串解析为
[{“date”:“1/1/16”},{“date”:“1/3/16”}]
在我的情况下,输入格式与
d3Data
中的字符串不匹配。我的字符串的格式将与代码中概述的格式相同。所有的数据都在一个字符串中。我知道这不是最终结果:但这应该给你一个想法。您只需要查看拆分并选择正确的VAL来扩展我在这里所做的工作。在我的情况下,输入格式与
d3Data
中的字符串不匹配。我的字符串的格式将与代码中概述的格式相同。所有的数据都在一个字符串中。我知道这不是最终结果:但这应该给你一个想法。您只需要查看拆分并选择正确的VAL来扩展我在这里所做的工作。