05.01.2022, 14:02
|
Кандидат Javascript-наук
|
|
Регистрация: 28.12.2018
Сообщений: 138
|
|
Как распарсить загруженный документ 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");
|
|
05.01.2022, 14:09
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,214
|
|
Сообщение от Katy93
|
у меня есть текстовый документ в которой записи располагаются в столбец
|
Скорее всего "построчно"...
Сообщение от Katy93
|
Как мне эти данные распарсить, чтобы они стали отдельной переменной.
|
Опять не понятно...
Приведи пример того что получаешь и пример того что собираешься получить...
|
|
05.01.2022, 14:24
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,743
|
|
let text = "..." // Текст содержащий много строк
let lines = text.split('\n') // Массив каждый элемент - отдельная строка
|
|
05.01.2022, 14:54
|
Кандидат Javascript-наук
|
|
Регистрация: 28.12.2018
Сообщений: 138
|
|
Цитата:
|
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.
|
|
05.01.2022, 15:00
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Katy93,
num = +lines[i];
|
|
05.01.2022, 15:30
|
Кандидат Javascript-наук
|
|
Регистрация: 28.12.2018
Сообщений: 138
|
|
рони, так заработала.
for(var i = 0; i < lines.length; i++)
{
num = +lines[i];
num = toFixed(num);
console.log(num);
}
Rise, т.е чтобы мой запрос стал синхронным, нужно добавить в "open", в конце false?
|
|
05.01.2022, 19:16
|
Кандидат Javascript-наук
|
|
Регистрация: 28.12.2018
Сообщений: 138
|
|
Удалось получить преобразованный список цифр, с плавующей точкой как теперь их распределить между тремя массивами. Нужно сделать так, чтобы это происходила, через каждый три шага например в первый массив попали бы 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
|
|
|
05.01.2022, 20:36
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,214
|
|
Сообщение от 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.
|
|
05.01.2022, 20:48
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
Я бы сделал с помощью библиотеки 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;
}
__________________
29375, 35
|
|
05.01.2022, 23:43
|
Кандидат Javascript-наук
|
|
Регистрация: 28.12.2018
Сообщений: 138
|
|
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];
|
|
|
|