nodejs Как читать текстовые документы для создания объектов - PullRequest
1 голос
/ 14 апреля 2020

Адский стекопоток. Мне интересно, как обрабатывать некоторые данные из текстового документа. Скажем так, у меня есть документ, в котором хранится информация о рептилиях, подобная этой.

reptiles.txt

name:age:length:color
name:age:length:color
name:age:length:color

Я хочу, чтобы скрипт узла читал этот файл и сохранял всю эту информацию в переменная объекта, подобная этой.

reptile[name:age:length:color]
reptile[name:age:length:color]
reptile[name:age:length:color]

Большое спасибо.

Вот обновленный код.

const fs = require('fs')
var CSV = {
  parse: function(csv, reviver) {
      reviver = reviver || function(r, c, v) { return v; };
      var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row;
      while (c < cc) {
          table.push(row = []);
          while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) {
              start = end = c;
              if ('"' === chars[c]){
                  start = end = ++c;
                  while (c < cc) {
                      if ('"' === chars[c]) {
                          if ('"' !== chars[c+1]) { break; }
                          else { chars[++c] = ''; } // unescape ""
                      }
                      end = ++c;
                  }
                  if ('"' === chars[c]) { ++c; }
                  while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ':' !== chars[c]) { ++c; }
              } else {
                  while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ':' !== chars[c]) { end = ++c; }
              }
              row.push(reviver(table.length-1, row.length, chars.slice(start, end).join('')));
              if (':' === chars[c]) { ++c; }
          }
          if ('\r' === chars[c]) { ++c; }
          if ('\n' === chars[c]) { ++c; }
      }
      return table;
  },
  stringify: function(table, replacer) {
      replacer = replacer || function(r, c, v) { return v; };
      var csv = '', c, cc, r, rr = table.length, cell;
      for (r = 0; r < rr; ++r) {
          if (r) { csv += '\r\n'; }
          for (c = 0, cc = table[r].length; c < cc; ++c) {
              if (c) { csv += ':'; }
              cell = replacer(r, c, table[r][c]);
              if (/[:\r\n"]/.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; }
              csv += (cell || 0 === cell) ? cell : '';
          }
      }
      return csv;
  }
};

//

const reptiles = fs.readFileSync('./text.txt', 'utf8')


//
for (let reptile of reptiles) {
  [name, age, length, color] = reptile

  console.log(`${name} is ${age} old, is ${length} long and is a ${color} colour`)
}

console.log((reptiles))

Вывод этого так.

T is undefined old, is undefined long and is a undefined colour
u is undefined old, is undefined long and is a undefined colour
r is undefined old, is undefined long and is a undefined colour
t is undefined old, is undefined long and is a undefined colour
l is undefined old, is undefined long and is a undefined colour
...

Вот как я это сделал.

let text = fs.readFileSync('./text.txt', 'utf8');
const reptiles = CSV.parse(text)

Спасибо, друзья!

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Ваш формат очень похож на CSV, но с : в качестве разделителя вы можете использовать пакет или создать / найти анализатор, который поддерживает разные разделители.

Код был взят из этого ответа , изменение , на :

var CSV = {
  parse: function(csv, reviver) {
      reviver = reviver || function(r, c, v) { return v; };
      var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row;
      while (c < cc) {
          table.push(row = []);
          while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) {
              start = end = c;
              if ('"' === chars[c]){
                  start = end = ++c;
                  while (c < cc) {
                      if ('"' === chars[c]) {
                          if ('"' !== chars[c+1]) { break; }
                          else { chars[++c] = ''; } // unescape ""
                      }
                      end = ++c;
                  }
                  if ('"' === chars[c]) { ++c; }
                  while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ':' !== chars[c]) { ++c; }
              } else {
                  while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ':' !== chars[c]) { end = ++c; }
              }
              row.push(reviver(table.length-1, row.length, chars.slice(start, end).join('')));
              if (':' === chars[c]) { ++c; }
          }
          if ('\r' === chars[c]) { ++c; }
          if ('\n' === chars[c]) { ++c; }
      }
      return table;
  },
  stringify: function(table, replacer) {
      replacer = replacer || function(r, c, v) { return v; };
      var csv = '', c, cc, r, rr = table.length, cell;
      for (r = 0; r < rr; ++r) {
          if (r) { csv += '\r\n'; }
          for (c = 0, cc = table[r].length; c < cc; ++c) {
              if (c) { csv += ':'; }
              cell = replacer(r, c, table[r][c]);
              if (/[:\r\n"]/.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; }
              csv += (cell || 0 === cell) ? cell : '';
          }
      }
      return csv;
  }
};
//
let reptiles = CSV.parse(`Turtle:62:85cm:brown
Iguana:2:45cm:green
Crocodile:14:2m:green`)

//
for (let reptile of reptiles) {
  [name, age, length, color] = reptile

  console.log(`${name} is ${age} old, is ${length} long and is a ${color} colour`)
}

/*
Turtle is 62 old, is 85cm long and is a brown colour
Iguana is 2 old, is 45cm long and is a green colour
Crocodile is 14 old, is 2m long and is a green colour
*/

// add new
reptiles.push(['snake', '1', '25cm', 'red and yellow'])

// as csv
console.log(CSV.stringify(reptiles))

/*
Turtle:62:85cm:brown
Iguana:2:45cm:green
Crocodile:14:2m:green
snake:1:25cm:red and yellow
*/
0 голосов
/ 14 апреля 2020

Вы можете сделать что-то подобное, используя JSON.parse и JSON.stringify:

var fs = require('fs');

var reptiles = [
    ["name", 23, 10, [255,255,255]],
    ["other name", 21, 5, [255,0,255]],
    ["another name", 43, 12, [0,255,255]]
]

fs.writeFile("reptile.json", JSON.stringify(reptiles), function(err) {
    if(err) {
        return console.log(err);
    }
}); 


fs.readFile('reptile.json', function(err, contents) {
    console.log(JSON.parse(contents.toString()));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...