无法从巨大的 xlsx 文件中获取正确的表格——使用 NodeJS XLSX 库
Not able to get right Sheets from huge xlsx files -- using NodeJS XLSX library
我正在尝试从一个巨大的文件(80 万行)中获取数据并通过 lambda (AWS) 将其放入数据库。
为此,我从 S3 获取 xlsx 文件作为缓冲区并读取它。
module.exports.getSalesData = new Promise((resolve, reject) => {
getFileFromS3(filename)
.then(function (workbook) {
console.log(workbook.SheetNames[1]); // 'sales'
console.log(workbook.SheetNames); // showing sales as [ 'main', 'sales', 'Sheet1' ]
console.log(Array.isArray(workbook.SheetNames)); // true
console.log(typeof workbook.SheetNames); // Object
console.log(Object.keys(workbook.Sheets)); // [ 'main', 'Sheet1' ] == why 'sales' is not here?
var sheet_name = workbook.SheetNames[1]; // sales tab
var json_sheet = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], { raw: true })
resolve(json_sheet)
})
.catch(err => {
console.log('File: ' + filename + ' doesn\'t exists on S3 or you\'re not connected to the internet.');
})
})
问题是 workbook.Sheets
我应该看到 [ 'main', 'sales', 'Sheet1' ]
,对吗?
然后我尝试像这样获取行数(已经转换为JSON):
getSalesData.then(function (data) {
console.log(data.length + ' rows');
console.log(data[0]);
}).catch(err => console.error(err));
其中参数data
就是上面函数中定义的json_sheet
。
所以对于 data.length
(行数)我得到 0 而不是 800k+。
而且,当然,我无法得到 data[0]
即 undefined
.
PS.: 文件有 57.3mb -- 不确定是否是这个原因。
在此先感谢您的帮助。
所以基本上发生的事情是 NodeJS 无法读取完整文件,因为它破坏了字符串的 NodeJS VM 内存限制。
所以我要做的就是像这样增加内存限制:
node --max-old-space-size=2048 services/process/process-sales.js
这将从 512MB 增加到 2048MB / 2GB 的 NodeJS 内存。
但这只是读取大量值的解决方案。
我不建议使用 NodeJS 来威胁这样的大量数据。取而代之的是 Python 使用像 Pandas 这样很棒的库。
PS.: 只是我的意见和使用nodejs处理数据的经验。我不认为 nodejs 是为此而生的。
我正在尝试从一个巨大的文件(80 万行)中获取数据并通过 lambda (AWS) 将其放入数据库。 为此,我从 S3 获取 xlsx 文件作为缓冲区并读取它。
module.exports.getSalesData = new Promise((resolve, reject) => {
getFileFromS3(filename)
.then(function (workbook) {
console.log(workbook.SheetNames[1]); // 'sales'
console.log(workbook.SheetNames); // showing sales as [ 'main', 'sales', 'Sheet1' ]
console.log(Array.isArray(workbook.SheetNames)); // true
console.log(typeof workbook.SheetNames); // Object
console.log(Object.keys(workbook.Sheets)); // [ 'main', 'Sheet1' ] == why 'sales' is not here?
var sheet_name = workbook.SheetNames[1]; // sales tab
var json_sheet = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], { raw: true })
resolve(json_sheet)
})
.catch(err => {
console.log('File: ' + filename + ' doesn\'t exists on S3 or you\'re not connected to the internet.');
})
})
问题是 workbook.Sheets
我应该看到 [ 'main', 'sales', 'Sheet1' ]
,对吗?
然后我尝试像这样获取行数(已经转换为JSON):
getSalesData.then(function (data) {
console.log(data.length + ' rows');
console.log(data[0]);
}).catch(err => console.error(err));
其中参数data
就是上面函数中定义的json_sheet
。
所以对于 data.length
(行数)我得到 0 而不是 800k+。
而且,当然,我无法得到 data[0]
即 undefined
.
PS.: 文件有 57.3mb -- 不确定是否是这个原因。
在此先感谢您的帮助。
所以基本上发生的事情是 NodeJS 无法读取完整文件,因为它破坏了字符串的 NodeJS VM 内存限制。
所以我要做的就是像这样增加内存限制:
node --max-old-space-size=2048 services/process/process-sales.js
这将从 512MB 增加到 2048MB / 2GB 的 NodeJS 内存。
但这只是读取大量值的解决方案。
我不建议使用 NodeJS 来威胁这样的大量数据。取而代之的是 Python 使用像 Pandas 这样很棒的库。
PS.: 只是我的意见和使用nodejs处理数据的经验。我不认为 nodejs 是为此而生的。