我正在阅读使用 javaScript 上传的 .csv /xlsx 文件,并获得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
读取文件数据的第一个代码中的编码?