Создать массив из данных файла

409
01 января 2017, 19:53

Есть файл, структура которого выглядит примерно так:

33,40,43,45,47,49
34,40,41,45,46,48
36,40,43,45,46,48
15,39,43,44,47,49
35,40,42,45,47,49
...

Я пытаюсь загрузить данные файла и записать все что в нем есть в одномерный массив, важно что бы он в итоге был числовой. Есть один вариант, но мне кажется что он неэффективен ибо все можно сделать гораздо проще существующими функциями JS.

Мой вариант выглядит так и не работает ибо сколько всего я не пробовал - выходит либо undefigned или строка. Например я так и не понял как расширять массив(одномерный) другими массивами, что бы при этом его данные стали числовыми.

if (window.File && window.FileReader && window.FileList && window.Blob) { 
	document.getElementById('file').addEventListener('change', function(e) { 
	var file = e.target.files[0]; 
	var reader = new FileReader(); 
	reader.onload = function(e) { 
		var text = e.target.result; 
		var newarray = text.split('\n'); 
		for (i=0; i<newarray.length; i++) {array.concat(newarray[i].split(','));} 
		for (i=0; i<array.length; i++) array[i] = Math.floor((array[i]/50)*100)/100; 
		for (i=0; i<array.length-501; i++) { 
			array2.push([array.slice(i,i+500), [array[i+501]]]); 
		} 
	}; 
	   
	reader.readAsText(file); 
	}); 
} else { 
	alert('File API is not supported!'); 
}

Ну и после этого я делаю еще один массив на основе данных данного. Это не должно влиять ни на что, кроме как еще раз подчеркнуть, что нужно записать все данные в одномерный массив.

Answer 1

Вы пытаетесь получить массив такого вида: [33, 40, 43, 45, ...]? Тогда достаточно двух вложенных циклов и двух вызовов String.prototype.split(), примерно как вы и делали. Работает это примерно так:

  1. Пихаем содержимое файла в строку.
  2. Прогоняем эту строку через String.prototype.trim(), чтобы убрать перенос строки в конце файла.
  3. Эту самую строку, содержащую файл, разбиваем на множество подстрок и превращаем в массив, в качестве разделителя используя символ переноса строки.
  4. Каждую подстроку разделяем еще раз, используя в качестве разделителя запятую.
  5. Проходимся по каждому числу и пушим в конечный массив.

let file = `33,40,43,45,47,49 
34,40,41,45,46,48 
36,40,43,45,46,48 
15,39,43,44,47,49 
35,40,42,45,47,49`; 
 
file = file.trim(); 
 
let rows = file.split("\n"); 
let flatArray = []; 
 
for (let row in rows) { 
  items = rows[row].split(','); 
 
  for (let item in items) { 
    flatArray.push(parseInt(items[item])); 
  } 
} 
 
console.log(flatArray);

Вместо for...in можете также использовать for...of (ES6) или Array.prototype.forEach() - как вам удобно.

READ ALSO
От чего зависит плавность сайтов?

От чего зависит плавность сайтов?

От чего зависит плавность сайтов? Имею в виду разные эфекты появления меню, слайдеры, скроллы и тпСделал меню, на пк проверяю все нормально,...

351
Путь к файлу в JQuery

Путь к файлу в JQuery

Есть selectbox инклюдит php файлы по выборуФайлы находятся для инклюда в этой же директории category1

551
NavigationDrawer и фрагменты

NavigationDrawer и фрагменты

Добрый день! Делаю приложение на андроид, решил взять интерфейс с NavigationDrawer и фрагментамиТо есть, в дравере несколько вкладок, при нажатии...

397
Как изменить значение select при изменении другого select

Как изменить значение select при изменении другого select

Есть jsp-страница, на нее я передаю в select список стран, у каждой страны есть список городов, который есть в моей БД отдельной таблицейКак сделать...

530