Как работать с txt файлом как с массивом?

217
15 июля 2018, 16:10

Есть текстовый файл, в нём хранятся данные в таком формате:

#31~Страна~
        @135~Город1~
            $8~Тип1
            $1~Тип2
        @136~Город2~
            $8~Тип1
            $15~Тип3

Формат файла менять нельзя. Как реализовать работу с данным тхт файлом, как с массивом?

Тоесть в форме выбирается страна. Идёт проверка в файле по этой стране и если есть данные (город), то создаётся селект с выбором города. При выборе города, проверка в файле и вывод Типа.

Естественно не решение нужно, а при помощи чего реализовать? а то я в полном ступоре, не пойму с чего начать. Спасибо

Answer 1

Думаю, мысль понятна:

let db = `#31~Страна~ 
@135~Город1~ 
$8~Тип1 
$1~Тип2 
@136~Город2~ 
$8~Тип1 
$15~Тип3`; 
let countries = {}; 
let cities = {}; 
let types = {}; 
 
db.split("\n").reduce((p, s) => { 
  let [, num, name] = s.match(/(\d+)~([^~]+)/); 
   
  switch (s.trim().charAt(0)) { 
    case '#': 
      p.co = num; 
      countries[num] = name; 
      break; 
    case '@': 
      p.ci = num; 
      if (!(p.co in cities)) cities[p.co] = []; 
      cities[p.co].push([p.ci, name]); 
      break; 
    case '$': 
      p.ty = num; 
      if (!(p.ci in types)) types[p.ci] = []; 
      types[p.ci].push([p.ty, name]); 
      break; 
  } 
   
  return p; 
}, {co: null, ci: null, ty: null}); 
 
V = new Vue({ 
  el: '#root', 
  data: { 
    country: -1, 
    city: -1, 
    type: -1 
  } 
});
[v-cloak] { 
  display: none; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script> 
<div id='root' v-cloak> 
  <select v-model="country"> 
    <option disabled value="-1">Pick your option here</option> 
    <option v-for="(name, key) in countries" :key="key" :value="key">{{ name }}</option> 
  </select> 
  <select v-model="city" v-if="country in cities"> 
    <option disabled value="-1">Pick your option here</option> 
    <option v-for="(city, key) in cities[country]" :key="city[0]" :value="city[0]">{{ city[1] }}</option> 
  </select> 
  <select v-model="type" v-if="city in types"> 
    <option disabled value="-1">Pick your option here</option> 
    <option v-for="(type, key) in types[city]" :key="type[0]" :value="type[0]">{{ type[1] }}</option> 
  </select> 
</div>

Answer 2

Я набросал код, который помещает в массив страны - отдельно код, отдельно название - и всю мешанину городов. Я могу и города обработать, если надо - но просто думаю, что в коротком коде легче видна суть. Если надо и города - мне нетрудно

    var txt ='#31~Страна~        @135~Город1~            $8~Тип1            $1~Тип2        @136~Город2~            $8~Тип1            $15~Тип3#31~Страна~        @135~Город1~            $8~Тип1            $1~Тип2        @136~Город2~            $8~Тип1            $15~Тип3';
var re1 = /#\d+~[А-Яа-я]+~[^#]+/g;
var re2 = /#(\d+)~([А-Яа-я]+)~([^#]+)/;
var massiv = []; //Массив, в который преобразуем текст 
if(re1.test(txt))
{
    var m1= txt.match(re1); //массив подстрок, соотв. странам
    for(var i = 0; i < m1.length; i++)
    {
        var oneCountry = m1[i];
        var m2 = oneCountry.match(re2); //разбор одной страны
        massiv[i] = { 'countryCode': m2[1] , 'counrtyName': m2[2], 'cities' : m2[3] };
    }
console.log(massiv); 
}
READ ALSO
Блок в компоненте родителя не видит ширины дочерних блоков выводимых внутри него

Блок в компоненте родителя не видит ширины дочерних блоков выводимых внутри него

В корневом компоненте app-component расположен header с несколькими ссылками для перехода по роутам, которые выводятся тут-же ниже в router-outletСтраницы,...

166
requestAnimationFrame, не получается зациклить

requestAnimationFrame, не получается зациклить

Модернизирую найденный кодВ оригинале клочья тумана проходят снизу вверх по canvas, и исчезают

192