忽略(但仍在使用)CSV中的不符合行以更新数据

时间:2018-03-17 15:29:14

标签: javascript csv d3.js

我一直在研究从URL解析数据,最终目标是实时或更新数据视觉效果。我正在处理的当前工作是来自Google财经网址。 API不再与我们在一起(可能它安静地休息),以下只是一些回填数据 - 仍然有效。我不是在尝试生产高质量的代码或任何东西;它更像是我的概念验证。

EXCHANGE%3DINDEXSP
MARKET_OPEN_MINUTE=570
MARKET_CLOSE_MINUTE=960
INTERVAL=300
COLUMNS=DATE,OPEN
DATA=
TIMEZONE_OFFSET=-240
a1521120900,555.45
1,554.53
2,554.07
3,553.9
4,552.67
...

问题是,虽然数据看起来遵循逗号分隔值格式(即上例中的最后4行),但前7行不符合要求。似乎也没有标题。前几行中的一些信息对于将unix时间转换为日期对象很有用,但我可能会为此执行单独的功能。就像头灯中的鹿一样,我不知道该怎么做,所以我只是把它解析为csv,看看会发生什么。以下是d3.csv()在控制台中的样子:

Array(84)
    0:object
        EXCHANGE%3DINDEXSP: "MARKET_OPEN_MINUTE=570"
...
    8:object
        EXCHANGE%3DINDEXSP: "2"
...

所以它似乎将EXCHANGE%3DINDEXSP视为标题并一直使用它。这是可以理解的,我没有给它一个简单的格式。在这一点上,我不确定如何继续。

问题:如何让我的csv解析器忽略前几行并在没有标题的情况下读取数据?我还需要能够接受数据的更新(根据帖子的顶部将采用原始格式)。

我想我可以在事后添加一个标题,但我不确定我是怎么做到的。正确的标题应为interval,open

1 个答案:

答案 0 :(得分:0)

您可以使用d3.text代替d3.csv

d3.text('data.csv', function(error, rawData) {

  var data =
    rawData
      .split("\n")
      .slice(7)
      .map(r => {
        var split = r.split(",");
        var l = new Object();
        l.k = split[0];
        l.v =  split[1];
        return l;
      });

  console.log(data);
});

产生:

[
  {k: "a1521120900", v: "555.45"},
  {k: "1", v: "554.53"},
  {k: "2", v: "554.07"},
  {k: "3", v: "553.9"},
  {k: "4", v: "552.67"}
]
  • rawData是表示文件内容的字符串。

  • 我们拆分rawData以获得一系列行。

  • 然后我们删除前7行:.slice(7)

  • 然后将每一行拆分并转换为一个对象。