Анализ файла и создание пары ключ-значение, которая соответствует определенным критериям - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть три разных набора данных - где, кто и когда. Структура файла результатов никогда не изменит только результаты внутри (значения, такие как числа и т. Д.), Но макет всегда останется неизменным.

Я пытаюсь проанализировать файл, поэтому, когда я загружаю файл и запускаю его через 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 голосов
/ 10 сентября 2018

При условии, что ваша грамматика предельно проста, не требует каких-либо продвинутых методов синтаксического анализа, вы можете легко разобраться с петлями split и for.

Вы можете разделить исходную строку на \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(`${JSON.stringify(data, null, 2)}
`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...