在D3中加载分隔符分隔值

时间:2017-11-21 19:19:28

标签: file d3.js

我正在尝试使用通用d3.dsvFormat()函数在D3中加载管道分隔值文件。虽然我没有收到错误,但我认为没有任何反应是因为没有执行回调函数。

我在这里检查了文档,但没有发现它有用:https://github.com/d3/d3-dsv/blob/master/README.md#dsvFormat

我的语法有问题吗?

var psv = d3.dsvFormat("|");
psv.parse("my_file.txt", function(error, data) {
    Do a bunch of stuff with the data....
    console.log(data);  //nothing happens here
});

1 个答案:

答案 0 :(得分:3)

psv.parse想要文本,你传递文本 - 只是它没有任何管道:" my_file.txt"。由于这是一行文本而第一行文本转换为列名,因此您无法获得任何数据。

您的问题是psv.parse无法为您获取文件,例如d3.csv或d3.tsv (而psv.parse()的行为类似于d3.csvParse()或d3。 tsvParse())。幸运的是,这并不难解决。

如果我们查看d3.csv的API文档,我们可以为任何分隔文件重新创建相同的功能。使用d3.csv,

  

如果指定了回调,则发送GET请求   相当于:

d3.request(url)
    .mimeType("text/csv")
    .response(function(xhr) { return d3.csvParse(xhr.responseText, row); })
    .get(callback);

from API docs

我们只需要为管道分隔文件模拟这个:

var psv = d3.dsvFormat("|");

d3.request("my_file.txt")
  .mimeType("text/plain")
  .response(function(data) { return psv.parse(data.response) })
  .get(function(data) {
     console.log(data);
  });

它比普通的旧d3.csv()或d3.tsv()更冗长,但使用get方法中的回调函数实现了相同的结果。

您也可以在响应方法中使用data.responseText,但我不确定区别是什么,在我的快速测试中看起来都相同。

您可能还注意到我没有在响应方法中指定行函数,这是一个可选函数,它允许将行对象转换为更具体的表示形式",例如:返回数字而不是字符串。 API documentation)。

最后一点:

关于原始代码,psv.parse("text")会返回数据,您不会为此方法使用回调函数。以下代码段演示了如何解析直管分隔文本:



var psv = d3.dsvFormat("|");
var data = psv.parse("a|b\n1|2\n4|3")
console.log(data);

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>
&#13;
&#13;
&#13;