我正在尝试使用通用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
});
答案 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);
我们只需要为管道分隔文件模拟这个:
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;