如何使用带有d3js的queuejs并行加载30个csv文件?

时间:2015-07-14 20:01:12

标签: javascript csv d3.js

这里有两个主要问题:

  1. 我们想要并行加载文件

  2. 由于这些文件是并行加载的,因此我们不知道它们的加载顺序。我想解析每个文件名中的一个键,将d3.csv解析的文件内容数组作为相应的值

  3. 就是说,返回的结果是

       q.awaitAll(function(error, results) { console.log("all done!"); });
    

    应该是

    results={
      "key1":array_read_from_myData_key1.csv,
      "key2":array_read_from_myData_key2.csv,
      ...
      "key30":array_read_from_myData_key30.csv
    }
    

    如何将每个文件名作为键添加到下面的每个数组(results [i])?

    var q = queue(), // create the queue
        dataSources = [ // the data sources
            'myData_key1.csv',
            'myData_key2.csv',
            'myData_key3.csv',
            ...,
            'myData_key30.csv'
        ];
    
    
    // Go through each data source and add it to the queue:
    dataSources.forEach(function (source) {
        q.defer(function (callback) {
            d3.csv(source, callback);
        });
    });
    
    // Wait for all requests to be completed:
    q.awaitAll(function (error, results) {
        console.log(results);
    })
    

1 个答案:

答案 0 :(得分:1)

你可以在这里扩展你的电话:

dataSources.forEach(function (source, index) {
  q.defer(function (callback) {
    d3.csv(source, function(data){
       var fileData = {
           name: dataSources[index],
           data: data
       };
       callback(fileData);
   });
  });
});

根据您的评论,您可以尝试执行以下操作,但不能100%确定它会起作用:

 var finalData = {};

 dataSources.forEach(function (source, index) {
  q.defer(function (callback) {
    d3.csv(source, function(data){
       if (data) {
         //regex the key from file name
         var matcher = /^(myData)_([a-z][a-z][a-z][0-9])\.csv$/;
         var key = matcher.exec(dataSources[index])[1];
         //assign value to external object
         finalData[key] = data;
         //callback success
         callback(true);
       }
       else {
        //log error if required
        callback(false);
       }
   });
  });
});

// Wait for all requests to be completed:
q.awaitAll(function (error, results) {
   console.log(finalData);
})

希望这能解决您的问题。

相关问题