Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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.json中的d3.csv组合多个csv文件数据输入的最佳方法是什么?_Javascript_Json_Csv_D3.js - Fatal编程技术网

Javascript 使用d3.json中的d3.csv组合多个csv文件数据输入的最佳方法是什么?

Javascript 使用d3.json中的d3.csv组合多个csv文件数据输入的最佳方法是什么?,javascript,json,csv,d3.js,Javascript,Json,Csv,D3.js,我对javascript和d3还是新手。我正试图找到最好的方法,将多个csv外部文件合并到d3中,然后对其进行处理。目前,我正在为一个文件使用下面这样的脚本 d3.csv("file1.csv",funciton(error,data) { // do something } 有没有一种方法可以连接file1.csv+file2.csv+。。文件9.csv 将类似的内容放入一个文件中。。在d3中 d3.csv( concat("file1.csv","file2,csv",..file

我对javascript和d3还是新手。我正试图找到最好的方法,将多个csv外部文件合并到d3中,然后对其进行处理。目前,我正在为一个文件使用下面这样的脚本

d3.csv("file1.csv",funciton(error,data) {

// do something 

} 
有没有一种方法可以连接file1.csv+file2.csv+。。文件9.csv 将类似的内容放入一个文件中。。在d3中

d3.csv( concat("file1.csv","file2,csv",..file9.csv") ,function(error,data) {

// do something 

} 

我建议在托管javascript的服务器上执行此操作,然后向d3提供单个文件。鉴于所有csv文件都是相同的格式,并且按照您的示例的顺序命名,下面是一种在unix命令行上连接它们的简单方法:


head-q-n1 file1.csv>concat.csv#用第1行(标题)覆盖
tail-q-n+2文件*.csv>>concat.csv#从所有匹配文件中附加行2+


编辑,强制客户端方式,使用jquery:

var remaining = 0;
var collection = [];

$(document).ready(concatCSVs)

function concatCSVs(){
  var uris = ['csv1.csv', 'csv2.csv'];
  remaining = uris.length;
  uris.forEach(function(uri){
    getCSV(uri, collector)
  })
}

function getCSV(uri, callback){
  $.ajax(uri, {
    success: callback
  })
}

function collector(data){
  if(remaining == 0){
    throw new Error('Got more results than expected')
  }
  remaining -= 1;
  collection.push(data);
  if(remaining == 0){ // Finished!
    d3init(collection);
  }
}

function d3init(collection){
  console.log('Proceeding to load d3 with');
  console.log(collection);
}

按行拆分并将标题行与内容行隔离留给读者作为练习

我建议在托管javascript的服务器上执行此操作,然后将单个文件提供给d3。鉴于所有csv文件都是相同的格式,并且按照您的示例的顺序命名,下面是一种在unix命令行上连接它们的简单方法:


head-q-n1 file1.csv>concat.csv#用第1行(标题)覆盖
tail-q-n+2文件*.csv>>concat.csv#从所有匹配文件中附加行2+


编辑,强制客户端方式,使用jquery:

var remaining = 0;
var collection = [];

$(document).ready(concatCSVs)

function concatCSVs(){
  var uris = ['csv1.csv', 'csv2.csv'];
  remaining = uris.length;
  uris.forEach(function(uri){
    getCSV(uri, collector)
  })
}

function getCSV(uri, callback){
  $.ajax(uri, {
    success: callback
  })
}

function collector(data){
  if(remaining == 0){
    throw new Error('Got more results than expected')
  }
  remaining -= 1;
  collection.push(data);
  if(remaining == 0){ // Finished!
    d3init(collection);
  }
}

function d3init(collection){
  console.log('Proceeding to load d3 with');
  console.log(collection);
}

按行拆分并将标题行与内容行隔离留给读者作为练习

这里有一个仅使用d3的解决方案。你可以在行动中看到它

Javascript代码是:

function multiCsv(files, callback) {
  var results = [];
  var error = "";
  var filesLength = (files || []).length;
  var callbackInvoked = false;
  for (var i = 0; i < filesLength; i++) {
    (function(url) {
      d3.csv(url, function(data) {
        if (data === null) {
          error += "Error retrieving \"" + url + "\"\n";
        } else {
          results.push(data);
        }
        // all files retrieved or an error occurred
        if (!callbackInvoked && (error || results.length === filesLength)) {
          if (error) {
            callback(error, null); // might want to send partial results here
          } else {
            callback(null, d3.merge(results));
          }
          callbackInvoked = true;
        }
      });
    })(files[i]);
  }
}
函数multiCsv(文件,回调){ var结果=[]; var误差=”; var filesLength=(files | |[]).length; var callbackcalled=false; 对于(var i=0;i 您可以这样使用它:

multiCsv(["file1.csv", "file2.csv", "file3.csv"], function (err, results) {
  if (err) {
    alert(err);
    return;
  }
  var ul = document.createElement('ul');
  for (var i = 0, len = results.length; i < len; i++) {
    var li = document.createElement('li');
    li.textContent = results[i].FirstName + ' ' + results[i].LastName + ', ' + results[i].Age;
    ul.appendChild(li);
  }
  document.body.appendChild(ul);
});
multiCsv([“file1.csv”、“file2.csv”、“file3.csv”],函数(错误,结果){
如果(错误){
警惕(err);
回来
}
var ul=document.createElement('ul');
对于(变量i=0,len=results.length;i
(这只是向包含合并数组内容的页面添加了一个


我还没有全面测试这个函数,所以YMMV。但它对我的Chrome简单测试用例有效。

这里有一个仅使用d3的解决方案。你可以在行动中看到它

Javascript代码是:

function multiCsv(files, callback) {
  var results = [];
  var error = "";
  var filesLength = (files || []).length;
  var callbackInvoked = false;
  for (var i = 0; i < filesLength; i++) {
    (function(url) {
      d3.csv(url, function(data) {
        if (data === null) {
          error += "Error retrieving \"" + url + "\"\n";
        } else {
          results.push(data);
        }
        // all files retrieved or an error occurred
        if (!callbackInvoked && (error || results.length === filesLength)) {
          if (error) {
            callback(error, null); // might want to send partial results here
          } else {
            callback(null, d3.merge(results));
          }
          callbackInvoked = true;
        }
      });
    })(files[i]);
  }
}
函数multiCsv(文件,回调){ var结果=[]; var误差=”; var filesLength=(files | |[]).length; var callbackcalled=false; 对于(var i=0;i 您可以这样使用它:

multiCsv(["file1.csv", "file2.csv", "file3.csv"], function (err, results) {
  if (err) {
    alert(err);
    return;
  }
  var ul = document.createElement('ul');
  for (var i = 0, len = results.length; i < len; i++) {
    var li = document.createElement('li');
    li.textContent = results[i].FirstName + ' ' + results[i].LastName + ', ' + results[i].Age;
    ul.appendChild(li);
  }
  document.body.appendChild(ul);
});
multiCsv([“file1.csv”、“file2.csv”、“file3.csv”],函数(错误,结果){
如果(错误){
警惕(err);
回来
}
var ul=document.createElement('ul');
对于(变量i=0,len=results.length;i
(这只是向包含合并数组内容的页面添加了一个


我还没有全面测试这个函数,所以YMMV。但是它对我在Chrome中的简单测试用例有效。

为什么不在d3看到它之前就这样做呢?你能确切地告诉我如何在javascript@Plato中做到这一点吗?你是否已经在使用任何promise或延迟库来简化这一过程?或者你愿意使用一个吗?@GregL是的,我是开放的,我是javascript新手,如果你能告诉我如何归档这将是非常好的。为什么不在d3看到它之前做它呢?你能告诉我在javascript@Plato中我该如何做吗?你是否已经在使用任何承诺或延迟库来简化这一过程?或者你愿意使用一个吗?@GregL是的,我是开放的,我是javascript新手,如果你能告诉我如何归档这将是非常好的。这些文件是从多个地方输出的,它们也被单独使用,我正在寻找一种在javascript中结合这一点的方法。或者这些文件是从多个地方输出的,这些地方也被单独使用,我正在寻找一种在javascript中组合这些文件的方法。还是d3