Я работаю над чтением файла .csv / xlsx, загруженного с использованием javaScript, и получаю результат как array
, содержащий каждую строку.Я смог прочитать файл и получить данные, используя FileReader
и SheetJs со следующим кодом.
// code for the new excel reader
$scope.do_file = function(files)
{
$scope.fileContent = [];
var X = XLSX;
var global_wb;
var f = files[0];
var reader = new FileReader();
reader.onload = function(e)
{
var data = e.target.result;console.log(data);
global_wb = X.read(data, {type: 'array'});
var output = "";
var result = {};
global_wb.SheetNames.forEach(function(sheetName) {
var roa = X.utils.sheet_to_json(global_wb.Sheets[sheetName], {header:1});
if(roa.length) result[sheetName] = roa;
});
$scope.fileContent = result["Sheet1"];
if(!result["Sheet1"])
{
$scope.fileContent = result["contacts"].filter(function(el) { return typeof el != "object" || Array.isArray(el) || Object.keys(el).length > 0; });
}
};
reader.readAsArrayBuffer(f);
};
Для чтения большинства файлов код работает, но когда файл содержит ивриттекст с кодировкой Windows-1255. Я получаю данные.
В поисках дополнительных параметров я попытался прочитать файл как текст, используя reader.readAsText
ипри необходимости измените кодировку, проверьте следующий код:
function is_Hebrew(data)
{
var position = data.search(/[\u0590-\u05FF]/);
return position >= 0;
}
$scope.do_file = function(files)
{
var fullResult = [];
var file =files[0];
var reader = new FileReader();
reader.onload = function(e){
var data = e.target.result;
if(!is_Hebrew(data.toString()))
{
reader.readAsText(file,'ISO-8859-8');
}
};
reader.readAsText(file);
reader.onloadend = function(){
var lines = reader.result.split('\r\n');
console.log(lines);
lines.forEach(element => {
var cell = element.split(',');
fullResult.push(cell);
});
console.log(reader);
};
};
, но приведенный выше код не подходит, поскольку он не считывает файл, поскольку каждая строка идентифицирует каждую ячейку.если любая из ячеек содержит строку со значением, разделенным запятой (например, если ячейка содержит строковое значение, такое как «25, 28, 29»), вывод массива дает неверные данные, поскольку он рассматривает каждое значение как каждую ячейку.
Поэтому я решил придерживаться первого метода, но я не могу изменить кодировку. Есть ли способ изменить кодировку в первом коде, где я использовал readAsArrayBuffer
для чтения данных файла?