Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как распарсить загруженный документ js, чтобы каждая строка стала переменной? (https://javascript.ru/forum/misc/83537-kak-rasparsit-zagruzhennyjj-dokument-js-chtoby-kazhdaya-stroka-stala-peremennojj.html)

Katy93 05.01.2022 14:02

Как распарсить загруженный документ js, чтобы каждая строка стала переменной?
 
Здравствуйте, у меня есть текстовый документ в которой записи располагаются в столбец. Для загрузки я создала функцию LoadFromFile Для вывода использую req.responseText. Как мне эти данные распарсить, чтобы они стали отдельной переменной. Каждую строку мне дальше нужно пропустить через другую функцию? Вот мой код:
function LoadFromFile(FileName){
      var req = new XMLHttpRequest();
      
      req.open("GET", FileName);
     
      req.onreadystatechange = function() {
        
        if(req.readyState===4){
         
          if(req.status===200){
            console.log(req.responseText);  
          }
        }
      }
      try
      {
         req.send(null);
      }
      catch (e)
      {
         alert(e.message);
      }
      
    }
   LoadFromFile("models/Object.txt");

ksa 05.01.2022 14:09

Цитата:

Сообщение от Katy93
у меня есть текстовый документ в которой записи располагаются в столбец

Скорее всего "построчно"...
Цитата:

Сообщение от Katy93
Как мне эти данные распарсить, чтобы они стали отдельной переменной.

Опять не понятно...
Приведи пример того что получаешь и пример того что собираешься получить...

voraa 05.01.2022 14:24

let text = "..." // Текст содержащий много строк
let lines = text.split('\n') // Массив каждый элемент - отдельная строка

Katy93 05.01.2022 14:54

Цитата:

let text = "..." // Текст содержащий много строк
let lines = text.split('\n') // Массив каждый элемент - отдельная строка
Распарсить получилось, но вот преобразовать опять не выходит. Я думала, что получив отдельное число я смогу преобразовать экспоненциальную запись, а вместо этого когда я делаю преобразование, то выводятся изначальные данные из документа.

Содержание документа Object.txt
Цитата:

2.12151364375213E+0001
-4.65241027215574E-0001
1.24533965323114E+0001
2.21470432354003E+0001
-1.35650478231506E+0001
5.17833965543514E+0001
2.52214176162443E+0001
-1.15183292003216E+0001
3.76599590303214E+0001
2.57543176121343E+0001
-1.12383293127446E+0001
Вот пример:
//Функция для преобразования
    function toFixed(x) {
      if (Math.abs(x) < 1.0) {
        var e = parseInt(x.toString().split('e-')[1]);
        if (e) {
            x *= Math.pow(10,e-1);
            x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
        }
      } else {
        var e = parseInt(x.toString().split('+')[1]);
        if (e > 20) {
            e -= 20;
            x /= Math.pow(10,e);
            x += (new Array(e+1)).join('0');
        }
      }
      return x;
    }
    
  
    
    function LoadFromFile(FileName){
      var req = new XMLHttpRequest();
      var data = "1";
      req.open("GET", FileName);
     
      req.onreadystatechange = function() {
        
        if(req.readyState===4){
         
          if(req.status===200){
            
            let text = req.responseText // Текст содержащий много строк
            let lines = text.split('\n') // Массив каждый элемент - отдельная строка
            let num;
            for(var i = 0; i < lines.length; i++)
            {
                num = toFixed(lines[i]);
                console.log(num);
            }

          }
        }
      }
      try
      {
         req.send(null);
      }
      catch (e)
      {
         alert(e.message);
      }
      
    }


Функция toFixed работает, если взять любое число из документа и добавить в toFixed, то выведится число со сдвигом запятой. Например, если прописать вот так.
num = toFixed(2.12151364375213E+0001);
console.log(num);

Мы получим: 21.2151364375213
Если через цикл ничего не происходит.
for(var i = 0; i < lines.length; i++)
            {
                num = toFixed(lines[i]);
                console.log(num);
            }

Возвращается, то же самое что и в документе.
Цитата:

2.12151364375213E+0001
-4.65241027215574E-0001
1.24533965323114E+0001
2.21470432354003E+0001
-1.35650478231506E+0001
5.17833965543514E+0001
2.52214176162443E+0001
-1.15183292003216E+0001
3.76599590303214E+0001
2.57543176121343E+0001
-1.12383293127446E+0001

рони 05.01.2022 15:00

Katy93,
num = +lines[i];

Rise 05.01.2022 15:16

Цитата:

Сообщение от Katy93
      try
      {
         req.send(null);
      }
      catch (e)
      {
         alert(e);
      }

Это работает только для синхронных запросов:

var xhr = new XMLHttpRequest();
xhr.open("GET", 'https://example.com', false);
try {
    xhr.send();
} catch (e) {
    alert(e);
}

А у вас асинхронный:
var xhr = new XMLHttpRequest();
xhr.open("GET", 'https://example.com');
try {
    xhr.send();
} catch (e) {
    alert(e);
}

Katy93 05.01.2022 15:30

рони, так заработала.
for(var i = 0; i < lines.length; i++)
            {
                num = +lines[i];
                num = toFixed(num);
                console.log(num);
            }


Rise, т.е чтобы мой запрос стал синхронным, нужно добавить в "open", в конце false?

Rise 05.01.2022 15:48

Katy93,
Да, но синхронный запрос блокирует страницу, такие запросы сейчас не актуальны. У вас просто устаревший пример кода, актуальные примеры можно найти здесь.

Katy93 05.01.2022 19:16

Удалось получить преобразованный список цифр, с плавующей точкой как теперь их распределить между тремя массивами. Нужно сделать так, чтобы это происходила, через каждый три шага например в первый массив попали бы 1,4,7,10 строка, во второй массив 2, 5,8,11, в третий массив соотвественно 3, 6,9,12 строка.

Вот пример список:

Цитата:

21.2151364375213
-0.465241027215574
12.4533965323114

22.1470432354003
-13.5650478231506
51.7833965543514

25.2214176162443
-11.5183292003216
37.6599590303214

25.7543176121343
-11.2383293127446
12.5323293127446
И распределение по массивам:
Цитата:

1 массив
21.2151364375213
22.1470432354003
25.2214176162443
25.7543176121343
2 массив
-0.465241027215574
-13.5650478231506
-11.5183292003216
-11.2383293127446
3 массив
12.4533965323114
51.7833965543514
37.6599590303214
12.5323293127446

ksa 05.01.2022 20:36

Цитата:

Сообщение от Katy93
Нужно сделать так, чтобы это происходила, через каждый три шага например в первый массив попали бы 1,4,7,10 строка, во второй массив 2, 5,8,11, в третий массив соотвественно 3, 6,9,12 строка.

Как вариант...
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
const b = []
for (let i = 0; i < a.length; i++) {
	const j = i % 3
	const k = Math.trunc(i / 3)
	if (!b[j]) b[j] = []
	b[j][k] = a[i]
}
alert(JSON.stringify(b, null, ' '))

Aetae 05.01.2022 20:48

Я бы сделал с помощью библиотеки lodash:
zip(...chunk(arr, 3));
Руками же это делается как-то так:
function spread(arr, count = 3) {
  const result = Array.from({length: count}, () => []);
  
  for(let i = 0; i < arr.length;) {
    for(let j = 0; j < count; j++) {
      result[j].push(arr[i++]);
    }
  }
  
  return result;
}

Katy93 05.01.2022 23:43

ksa, да работает.
let text = req.responseText // Текст содержащий много строк
            let lines = text.split('\n') // Массив каждый элемент - отдельная строка
            let num;
            const arr1 = []

            for(var i = 0; i < lines.length; i++)
            {
                const j = i % 3
                const k = Math.trunc(i / 3)

                num = +lines[i];
                num = toFixed(num);
                //console.log(num);
                if (!arr1[j]) arr1[j] = [];
                arr1[j][k] = num;


            }
           //var arr = JSON.stringify(b, null, ' ');
            var a = arr1[0];
            var b = arr1[1];
            var c = arr1[2];

Katy93 06.01.2022 16:28

Rise, сейчас пытаюсь использовать современную загрузку файла. В итоге у меня не получается загрузить документ. Вот пример кода:
function LoadFromFile()
    {
     
      let response = async function loadCities() {
        const response = await fetch(
          'https://aperesso.github.io/low_poly_room/room.json'
        );
        const cities = await response.json();
        console.log(cities);
      }
      loadCities().catch((err) => {
        console.log('Ошибка! ', err);
      });

    }

Выдает ошибку: loadCities is not defined

рони 06.01.2022 16:54

Цитата:

Сообщение от Katy93
let response =

это сотрите

Rise 06.01.2022 17:19

Katy93,
Здесь можешь посмотреть как ошибки обрабатывать. По твоему адресу запроса будет ошибка, потому что нужны разрешения.

Katy93 07.01.2022 16:45

Цитата:

Rise, Да, но синхронный запрос блокирует страницу, такие запросы сейчас не актуальны. У вас просто устаревший пример кода, актуальные примеры можно найти
Современный пример у меня не работает, поэтому буду пользоваться устаревшим.
function LoadFromFile(FileName){
      var req = new XMLHttpRequest();
      var data = "1";
      req.open("GET", FileName);
     
      req.onreadystatechange = function() {
        
        if(req.readyState===4){
         
          if(req.status===200){
            
            let text = req.responseText // Текст содержащий много строк
            let lines = text.split('\n') // Массив каждый элемент - отдельная строка
            let num;
            for(var i = 0; i < lines.length; i++)
            {
                num = toFixed(lines[i]);
                console.log(num);
            }

          }
        }
      }
      try
      {
         req.send(null);
      }
      catch (e)
      {
         alert(e.message);
      }
      
    }

Он по крайне мере нормально запускается во всех браузерах. До этого я уже изучила достаточно объемный материал по JS и сейчас просто времени нет, чтобы разбираться в современных примерах получения данных из текстовых документов.

Alexandroppolus 07.01.2022 21:06

Цитата:

Сообщение от Katy93
Современный пример у меня не работает

рони же написал, как поправить. Всё работает.

Rise 08.01.2022 21:45

Katy93,
Я не имел ввиду промисы, xhr тоже подойдёт, с onload и onerror, просто твой пример ошибки не ловит, держу в курсе, если пофигу, то ок.


Часовой пояс GMT +3, время: 16:54.