【问题标题】:Read formatted data with d3.dsv.parseRows使用 d3.dsv.parseRows 读取格式化数据
【发布时间】:2013-09-16 13:15:12
【问题描述】:

我开始学习 javascript 和 d3.js(版本 3.3.3)。我需要从格式既不是csv 也不是tsv 的文件中读取数据。我可能可以使用d3.dsv.parseRows,但我有点坚持 - 我真的很感谢一些帮助开始,一个例子会很棒。

数据格式为 ASCII,两列数字由未知数量的空白字符(制表符或空格)分隔。评论字符是#。

# Example 
# The data is obviously poorly aligned
# The two values in each row are separated 
# by one or more tabs and/or spaces
#
1.0   10.00
  2.0    20
3.0     30.          # this data line should be read
#  4.0    40.0       # this data line should be ignored
5.0   50.00

我需要将数据保存在一个数字数组中,这样我就可以继续进行一些不错的 d3 绘图:

[ [1.0,10.0], [2.0,20.0], [3.0,30.0], [5.0,50.0] ]

【问题讨论】:

  • 在这种情况下,通常更容易使用脚本将数据预处理为 JSON,然后您可以在 D3 中毫无问题地读取。
  • 不幸的是,我无法对数据文件进行预处理,它们数量庞大,而且来自第三方来源。

标签: javascript d3.js formatting


【解决方案1】:

听起来您必须编写自己的请求,我已经开始使用下面的几个注释,但您需要完成它...

var dsvFile = new XMLHttpRequest();
    dsvFile.open("GET", "dsv.txt", true);

var req = new XMLHttpRequest();
    req.onreadystatechange = function () {
      if (req.readyState == 4) {
        if (req.status === 200 || 
            req.status === 0) {

            var data = req.responseText;
            cleanData(data)
          }
        }
      };

    req.open('GET', "dsv.txt", true);
    req.send(null);

    var cleanData = function(data) {

      var clean = [];
      var lines = data.split("\n");

      for (var i = 0; i < lines.length; i++) {
        var comment = /^#/
        var whiteSpace = /^\s+/
        var OK = comment.exec(lines[i]) // check for comment lines
        var white = whiteSpace.exec(lines[i]) // check white whitespace at begining of line
        if(!OK) // if no comments then
          { 
            if(white) // if whitespace at begining of line remove 
            {
              var str = lines[i].replace(whiteSpace, '')
            } 
            else 
            {
              var str = lines[i]
            }
          clean.push(str)
          }
      };

      console.log(clean)

    };

【讨论】:

    【解决方案2】:

    要处理具有多个空格的数据文件(可能还有更复杂的模式), d3.text 可以与正则表达式组合,然后是 d3.csvParseRows

    var a = [];
    d3.text("http://cdsarc.u-strasbg.fr/ftp/J/AJ/159/187/table3.dat")
         .then(function(d){a = d3.csvParseRows(d.replace(/ +/g, ","))})
    

    注意由于 CORS,url 仅适用于某些网页。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2016-05-19
      • 1970-01-01
      • 2017-10-11
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多