获取和处理带分号分隔符且没有 headers 的数据
Fetching and processing data with semicolon delimiters and no headers
我在理解 D3.JS 获取文档时遇到了一些问题:
我的数据来源是:
20180601 000000;1.168200;1.168240;1.168140;1.168230;0;
20180601 000100;1.168220;1.168230;1.168190;1.168190;0;
20180601 000200;1.168180;1.168180;1.168080;1.168120;0;
20180601 000300;1.168130;1.168160;1.168130;1.168140;0;
格式为:
%Y%m%d %H%M%S;number1;number2;number3;number4;number5;
我的困难是:
- 将headers添加到数据
- 处理分号而不是逗号作为分隔符
1) 据我所知,我需要在不解析文件的情况下读取文件,然后将文本字符串连接到文件的开头,最后解析数据。
d3.text(data.csv, function(error, textString){});
var headers = ["date","time","data1","data2"].join("\t");
d3.csv.parse(headers + textString);
2)我可以使用dsv格式,把分隔符设置成分号吗?
d3.dsv(";", "text/plain")
我最终得到的粗略代码是:
var time_parse = d3.timeParse( '%Y%m%d %H%M%S');
var time_format = d3.timeFormat('%H%M');
d3.text(data.csv, function(error, textString){
var headers = ["time;number1;number2;number3;number4;number5;"].join("\t")
d3.csv.parse(headers + textString)
d3.dsv(";", "text/plain")
data.forEach(function(e,i){
data[i].time = time_parse(e.date);
})
})
理想情况下,我希望数据在记录时看起来像这样:
Time, Number1, Number2, Number3, Number4, Number5
00:00, 1.168200, 1.168240, 1.168140, 1.168230, 0
etc
我的思路有什么问题,有没有大神能指教一下我的问题以及以后类似问题的解决方法?
注意:我是 Javascript 和 d3 的新手,虽然我已经能够毫无问题地完成大部分涉及绘图 svg、创建轴和比例、过渡等的文档,但我正在努力让我的头脑真正从真实来源(例如互联网)获取数据并将它们处理成可行的东西。说了这么多请大家多多指教,我要学习。
不清楚你使用的是什么版本的 d3,你参考了 fetch API,但是你的一些代码在问题代码中看起来像 d3v3 和 v4(这可能是问题所在)不使用提取 API。无论如何,我将通过 v5,还有版本 4 和 3。
根据您拥有的代码块,您的所有这些想法看起来都非常接近。我们需要:
- 我们以文本形式读入 dsv,
- 添加headers(行尾
\n
),
- 和 运行 一切都通过 dsv 格式函数,它将使用
;
作为分隔符。
不需要 d3.csv.parse
尽管在你的问题代码块中
在下面的所有内容中,为了简单起见,我删除了日期格式 (糟糕,将其留在 v5 演示中)。
由于在 d3v5 中使用了 d3-fetch 模块,这种方法与更密切相关的 d3v3/v4 有点不同(密切相关的是它们都使用了 d3-request 模块,否则有一个有点不同)。
d3-获取:d3v5
对于 d3v5,使用 d3-fetch 模块的过程可能如下所示:
var dsv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv").then(function(text) {
var data = dsv.parse(headers+text);
console.log(data);
console.log(data.columns);
})
d3-请求:d3v4
为此,d3v4 有更多的灵活性。
如果我们查看 API 文档,我们会发现 d3.csv 等同于:
d3.request(url)
.mimeType("text/csv")
.response(function(xhr) { return d3.csvParse(xhr.responseText, row); });
(docs)
所以如果我们用d3.dsvFormat创建一个新的格式我们可以通过格式运行内容并得到我们的数据,我们也可以在这个过程中加上headers,一步到位:
var dsv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.request("dsv.dsv")
.mimeType("text/plain")
.response(function(data) { return dsv.parse(headers + data.response) })
.get(function(data) {
// use data here:
console.log(data);
console.log(data.columns);
});
这可能是更不典型的方法,所以我们可以效仿我在上面的 v5 中的做法:
var psv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv", function(error,data) {
var data = psv.parse(headers + data.reponse)
console.log(data);
console.log(data.columns);
})
d3-请求:d3v3
与上面d3v4和d3v5中的第二个选项一样,我们可以在text中解析,然后运行通过dsv格式函数(这里我们只需要考虑[=87之间d3命名空间的变化=]):
var dsv = d3.dsv(";","text/plain");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv", function(error,text) {
var data = dsv.parse(headers+text);
console.log(data);
// console.log(data.columns) // -> no columns property in v3
})
注
每行末尾的 ;
将创建一个空列,因为在它之后的下一行之前需要一个值。
我在理解 D3.JS 获取文档时遇到了一些问题:
我的数据来源是:
20180601 000000;1.168200;1.168240;1.168140;1.168230;0;
20180601 000100;1.168220;1.168230;1.168190;1.168190;0;
20180601 000200;1.168180;1.168180;1.168080;1.168120;0;
20180601 000300;1.168130;1.168160;1.168130;1.168140;0;
格式为:
%Y%m%d %H%M%S;number1;number2;number3;number4;number5;
我的困难是:
- 将headers添加到数据
- 处理分号而不是逗号作为分隔符
1) 据我所知,我需要在不解析文件的情况下读取文件,然后将文本字符串连接到文件的开头,最后解析数据。
d3.text(data.csv, function(error, textString){});
var headers = ["date","time","data1","data2"].join("\t");
d3.csv.parse(headers + textString);
2)我可以使用dsv格式,把分隔符设置成分号吗?
d3.dsv(";", "text/plain")
我最终得到的粗略代码是:
var time_parse = d3.timeParse( '%Y%m%d %H%M%S');
var time_format = d3.timeFormat('%H%M');
d3.text(data.csv, function(error, textString){
var headers = ["time;number1;number2;number3;number4;number5;"].join("\t")
d3.csv.parse(headers + textString)
d3.dsv(";", "text/plain")
data.forEach(function(e,i){
data[i].time = time_parse(e.date);
})
})
理想情况下,我希望数据在记录时看起来像这样:
Time, Number1, Number2, Number3, Number4, Number5
00:00, 1.168200, 1.168240, 1.168140, 1.168230, 0
etc
我的思路有什么问题,有没有大神能指教一下我的问题以及以后类似问题的解决方法?
注意:我是 Javascript 和 d3 的新手,虽然我已经能够毫无问题地完成大部分涉及绘图 svg、创建轴和比例、过渡等的文档,但我正在努力让我的头脑真正从真实来源(例如互联网)获取数据并将它们处理成可行的东西。说了这么多请大家多多指教,我要学习。
不清楚你使用的是什么版本的 d3,你参考了 fetch API,但是你的一些代码在问题代码中看起来像 d3v3 和 v4(这可能是问题所在)不使用提取 API。无论如何,我将通过 v5,还有版本 4 和 3。
根据您拥有的代码块,您的所有这些想法看起来都非常接近。我们需要:
- 我们以文本形式读入 dsv,
- 添加headers(行尾
\n
), - 和 运行 一切都通过 dsv 格式函数,它将使用
;
作为分隔符。
不需要 d3.csv.parse
尽管在你的问题代码块中
在下面的所有内容中,为了简单起见,我删除了日期格式 (糟糕,将其留在 v5 演示中)。
由于在 d3v5 中使用了 d3-fetch 模块,这种方法与更密切相关的 d3v3/v4 有点不同(密切相关的是它们都使用了 d3-request 模块,否则有一个有点不同)。
d3-获取:d3v5
对于 d3v5,使用 d3-fetch 模块的过程可能如下所示:
var dsv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv").then(function(text) {
var data = dsv.parse(headers+text);
console.log(data);
console.log(data.columns);
})
d3-请求:d3v4
为此,d3v4 有更多的灵活性。
如果我们查看 API 文档,我们会发现 d3.csv 等同于:
d3.request(url)
.mimeType("text/csv")
.response(function(xhr) { return d3.csvParse(xhr.responseText, row); });
(docs)
所以如果我们用d3.dsvFormat创建一个新的格式我们可以通过格式运行内容并得到我们的数据,我们也可以在这个过程中加上headers,一步到位:
var dsv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.request("dsv.dsv")
.mimeType("text/plain")
.response(function(data) { return dsv.parse(headers + data.response) })
.get(function(data) {
// use data here:
console.log(data);
console.log(data.columns);
});
这可能是更不典型的方法,所以我们可以效仿我在上面的 v5 中的做法:
var psv = d3.dsvFormat(";");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv", function(error,data) {
var data = psv.parse(headers + data.reponse)
console.log(data);
console.log(data.columns);
})
d3-请求:d3v3
与上面d3v4和d3v5中的第二个选项一样,我们可以在text中解析,然后运行通过dsv格式函数(这里我们只需要考虑[=87之间d3命名空间的变化=]):
var dsv = d3.dsv(";","text/plain");
var headers = ["time;number1;number2;number3;number4;number5;\n"]
d3.text("dsv.dsv", function(error,text) {
var data = dsv.parse(headers+text);
console.log(data);
// console.log(data.columns) // -> no columns property in v3
})
注
每行末尾的 ;
将创建一个空列,因为在它之后的下一行之前需要一个值。