首页 > 解决方案 > 解析文件并创建符合特定条件的键值对

问题描述

我得到了三组不同的数据 - Where Who 和 When。结果文件的结构永远不会只改变里面的结果(数字等值),但布局将始终保持不变。

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

目前,这是页面的视图:

在此处输入图像描述

这就是填充它并赋予它适当的颜色。

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 完成的。任何反馈或帮助将不胜感激。我对如何解决这个问题有一些想法,但我想在这里问一下,看看是否有人有真正好的技术。

标签: javascriptparsingobject

解决方案


如果你的语法非常简单,它不需要任何高级的解析技术,你可以很容易地用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>`);


推荐阅读