Превращение текстового файла в JSON - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь написать функцию, которая принимает текстовый файл в качестве ввода и преобразует его в древовидный формат JSON, чтобы я мог использовать его в своем проекте d3. js.

Текст Файл действительно прост: каждая строка, начинающаяся с 'b', представляет мешок, а следующее целое число - номер пакета. Каждая сумка содержит узлы.

Таким образом, первая строка - это сумка 1 с узлами 1 и 2. Строки, которые не содержат b, представляют собой связи между сумками. Так, например, мешок 1 указывает на мешок 2.

Пример ввода:

b 1 1 2 3
b 2 2 3 4
b 3 4 5 6
1 2
1 3

Ожидаемый результат:

const tree = {
  id: 1,
  name: '1, 2, 3',
  vertices: [1, 2, 3],
  children: [
    {
      id: 2,
      name: '2, 3, 4',
      vertices: [2, 3, 4],
    },
    {
      id: 3,
      name: '4, 5, 6',
      vertices: [4, 5, 6],
    },
  ],
};

код на данный момент (помощь Тома):

function readTreeInput(evt) {
  const file = evt.target.files[0];
  const fileReader = new FileReader();

  fileReader.onload = function convertTreeToJSON() {
    const lines = this.result.split('\n');
    const res = {}; let current = res;

    for (let line = 0; line < lines.length; line++) {
      const textLine = lines[line];
      if (textLine.startsWith('c') || textLine.startsWith('s')) continue;

      if (textLine.startsWith('b')) {
        const bagId = parseInt(textLine[2], 10);
        const firstNode = textLine[4];
        const secondNode = textLine[6];
        const thirdNode = textLine[8];
        let vertices;

        if (secondNode === undefined) {
          vertices = [firstNode];
        } else if (thirdNode === undefined) {
          vertices = [parseInt(firstNode, 10), parseInt(secondNode, 10)];
        } else {
          vertices = [firstNode, secondNode, thirdNode];
        }
        current.id = bagId;
        current.name = vertices.join(', '); // bagLabel;
        current.vertices = vertices;
        current = (current.children = [{}])[0];
      }
    }
    removeExistingTree();
    drawTree(res);
  };
  fileReader.readAsText(file);
}

Не совсем уверен, как go отсюда позаботиться о вложенности, какой-нибудь совет? :)

1 Ответ

1 голос
/ 08 апреля 2020

Есть проблемы? ;-) Я предпочитаю более простой textLine.split (''), но оставил большую часть вашего кода без изменений. И предположим, что FileReader не будет работать здесь.

var result = document.createElement('PRE');
result.innerText = x = JSON.stringify(
    convertTreeToJSON.call({ result: 'b 1 1 2\nb 2 2 3\nb 3 4 3\nb 4 5 4\n1 2\n2 3\n3 4' })
    , null, 1)
    .replace(/\[\n\s+(\d+),\n\s+(\d+)\n\s+]/g, '[$1, $2]')
    .replace(/\[\n\s+/g, '[').replace(/}\n\s+\]/g, '}]');
document.body.appendChild(result);
function convertTreeToJSON (x) {
    const lines = this.result.split('\n');
    const edges = [];
    const treeBags = [];
    const listOfIds = [];

    var res = {}; var current;

    for (let line = 0; line < lines.length; line++) {
        const textLine = lines[line];

        if (textLine.startsWith('c') || textLine.startsWith('s')) return;

        if (textLine.startsWith('b')) {
            const bagId = parseInt(textLine[2]);
            let bagLabel;
            let vertices;
            const firstNode = textLine[4];
            const secondNode = textLine[6];
            const thirdNode = textLine[8];

            if (secondNode === undefined) {
                vertices = [firstNode];
            } else if (thirdNode === undefined) {
                vertices = [parseInt(firstNode), parseInt(secondNode)];
            } else {
                vertices = [firstNode, secondNode, thirdNode];
            }

            if (res.id === undefined) {
                current = res;
            } else {
                current = res.children[res.children.push({}) - 1];
            }
            current.id = bagId;
            current.name = vertices.join(', '); // bagLabel;
            current.vertices = vertices;
            if (current == res) current.children = [];
        }
    }
    return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...