Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.01.2022, 14:02
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

Как распарсить загруженный документ 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");
Ответить с цитированием
  #2 (permalink)  
Старый 05.01.2022, 14:09
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Katy93
у меня есть текстовый документ в которой записи располагаются в столбец
Скорее всего "построчно"...
Сообщение от Katy93
Как мне эти данные распарсить, чтобы они стали отдельной переменной.
Опять не понятно...
Приведи пример того что получаешь и пример того что собираешься получить...
Ответить с цитированием
  #3 (permalink)  
Старый 05.01.2022, 14:24
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

let text = "..." // Текст содержащий много строк
let lines = text.split('\n') // Массив каждый элемент - отдельная строка
Ответить с цитированием
  #4 (permalink)  
Старый 05.01.2022, 14:54
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

Цитата:
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

Последний раз редактировалось Katy93, 05.01.2022 в 14:56.
Ответить с цитированием
  #5 (permalink)  
Старый 05.01.2022, 15:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Katy93,
num = +lines[i];
Ответить с цитированием
  #6 (permalink)  
Старый 05.01.2022, 15:16
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от 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);
}
Ответить с цитированием
  #7 (permalink)  
Старый 05.01.2022, 15:30
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

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


Rise, т.е чтобы мой запрос стал синхронным, нужно добавить в "open", в конце false?
Ответить с цитированием
  #8 (permalink)  
Старый 05.01.2022, 15:48
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

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

Последний раз редактировалось Rise, 05.01.2022 в 15:52.
Ответить с цитированием
  #9 (permalink)  
Старый 05.01.2022, 19:16
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 137

Удалось получить преобразованный список цифр, с плавующей точкой как теперь их распределить между тремя массивами. Нужно сделать так, чтобы это происходила, через каждый три шага например в первый массив попали бы 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
Ответить с цитированием
  #10 (permalink)  
Старый 05.01.2022, 20:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от 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, ' '))

Последний раз редактировалось ksa, 05.01.2022 в 20:39.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть ли в js понятие частоты кадров, наподобие как во флэше? andrew_F Общие вопросы Javascript 8 01.05.2012 20:25
Как обойти base href, чтобы ссылка на внешн. js была локальной? Andrej_2 Общие вопросы Javascript 2 18.11.2011 11:25
Как объяснить JS, что некая строка это название имеющегося объекта? DimonCry Общие вопросы Javascript 15 07.01.2011 23:43
Как сделать так, чтобы JS при нажатии на кнопку не выполняла запрос со страницы. JSProgrammer Элементы интерфейса 3 18.05.2010 20:18
Подскажите, пжлст, как вывести в тот же документ результат ф-ции? LexXxeL Элементы интерфейса 4 13.05.2009 13:26