解析文件并创建适合特定条件的键值对

时间:2018-09-10 15:23:48

标签: javascript parsing object

我有三套不同的数据-谁和何时。结果文件的结构将永远不会仅更改内部结果(数字等值),而布局将始终保持不变。

我正在尝试解析文件,因此当我上传文件并通过fileReader运行它时,它会处理设置的记录并使用文档中给定的记录。

当前,这是页面视图:

enter image description here

这就是填充它并为其赋予适当颜色的原因。

function drawRegionsMap() {
      var data = google.visualization.arrayToDataTable([
        ['Country', 'Occurrences'],
        ['Germany', 55],
        ['United States', 328],
        ['Brazil', 119],
        ['United Kingdom', 39],
        ['Italy', 39],
        ['Canada', 40],
        ['greenland', 80]
      ]);

      var options = {};

      var chart = new google.visualization.GeoChart(document.getElementById('regions_div'));

      chart.draw(data, options);
    }

函数上方,下面将提供结果数据。

journalism.When

2000 --> 219

2003 --> 194

1998 --> 190

2001 --> 173

2004 --> 155

2002 --> 155

1995 --> 144

2008 --> 127

1997 --> 123

1994 --> 117



journalism.Who

Atmos --> 85

J. Geophys --> 77

OECD --> 70

Grossman --> 56

EPA --> 54

PBL --> 49

Krueger --> 45

Stern --> 43

Selden --> 42

Taylor --> 41



journalism.Where

US --> 129

São Paulo --> 115

Brazil --> 104

U.S. --> 76

Germany --> 55

USA --> 45

America --> 42

Italy --> 39

UK --> 39

LA --> 36

因此,对于此解析,我需要它忽略前两个部分,而仅读取底部的journalism. Where

解决此问题的最佳方法是什么,我在解析数据方面从未真正工作过。这些都是通过VanillaJS完成的。任何反馈或帮助将不胜感激。我对如何解决这个问题有一些想法,但我想在这里询问是否有人真的技术很好。

1 个答案:

答案 0 :(得分:1)

只要您的语法非常简单,不需要任何高级解析技术,您就可以使用splitfor循环轻松地将其解决。

您基本上可以用\n\n\n\n分割源字符串以分割每个键。然后,对于每个块,您可以拆分为另一个\n\n,这将为您提供数据行,您可以在其中将第一项作为键名[journalist.who,...]并在其他项上进行迭代行用-->进行拆分,并获取拆分结果的第一项和第二项的键值。

最终结果将类似于下面的函数:

function parseData(src) {
  var blocks = src.split('\n\n\n\n');
  var keys = {};

  for (var i = 0; i < blocks.length; i++) {
    var block = blocks[i].split('\n\n');
    var label = block[0];
    var key = keys[label] = {};

    for (var j = 1; j < block.length; j++) {
        var data = block[j].split(' --> ');
            key[data[0]] = data[1];
    }
  }

  return keys;
}
  

警告::如果您使用的是行尾样式[\r\n]之类的窗口,则必须用\r\n而不是\n分割,否则您可以删除像这样解析之前所有\r

var src = `...`;

src = src.replace(/\r/g, '');

var data = parseData(src);

下面是我描述的解决方案的一个工作片段。

var src = `journalism.When

2000 --> 219

2003 --> 194

1998 --> 190

2001 --> 173

2004 --> 155

2002 --> 155

1995 --> 144

2008 --> 127

1997 --> 123

1994 --> 117



journalism.Who

Atmos --> 85

J. Geophys --> 77

OECD --> 70

Grossman --> 56

EPA --> 54

PBL --> 49

Krueger --> 45

Stern --> 43

Selden --> 42

Taylor --> 41



journalism.Where

US --> 129

São Paulo --> 115

Brazil --> 104

U.S. --> 76

Germany --> 55

USA --> 45

America --> 42

Italy --> 39

UK --> 39

LA --> 36`;

function parseData(src) {
  var blocks = src.split('\n\n\n\n');
  var keys = {};

  for (var i = 0; i < blocks.length; i++) {
    var block = blocks[i].split('\n\n');
    var label = block[0];
    var key = keys[label] = {};

    for (var j = 1; j < block.length; j++) {
      var data = block[j].split(' --> ');
      key[data[0]] = data[1];
    }
  }

  return keys;
}

var data = parseData(src);

document.write(`<pre>${JSON.stringify(data, null, 2)}</pre>`);