NodeJS:如何拆分大 ODS 文件?

问题描述

我正在使用 MysqL 数据库,并且有两种类型的文件要导入: 第一个是我可以使用的 CSV 文件

LOAD DATA INFILE 'path-to-csv_file'

第二种类型的文件ODSopendocument 电子表格),MysqL 不支持 LOAD DATA INFILE。 我的解决方案是使用具有 XLSX.readfile 命令的 xlsx 包然后使用 csv-writer 将 ODS 转换为 CSV。但是,在处理大型 ODS 文件时,我的程序崩溃了,因为它使用了太多内存。我搜索解决方案并找到了 streams 但 xlsx 包没有读取流。在此之后,我尝试使用 fs 因为它有一个 fs.createReadStream 命令,但是这个模块不支持 ODS 文件一个例子是比较 fs.readFilexlsx.readFile 中的两个回报。

fs.readFile:

PK♥♦m�IQ�l9�.mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK♥♦m�IQM◄ˋ%�%↑Thumbnails/thumbnail.png�PNG
→
IHDR�♥A�-=♥pltE►►☼§¶►∟↓*.!/<22/8768:G6AN>AM>BP>MaC:;A?GOE?EFJGJRJQ[TJEQOQ\QJYWYKVeX\dX]p\bkXetaNJgTEe[Wp^Wa_aja\ue\hfgektjqztkeqnpyqlwwvco�jw�j}�v{�q⌂�~�⌂{��t��t��u��z��y��|��{��{��}���o]�od�vj�|v�⌂n�⌂r��{��n��x��~��~������

XLSX.readFile:

  J323: { t: 's',v: '79770000',w: '79770000' },K323: { t: 's',v: '20200115',w: '20200115' },

使用 XLSX 模块很容易,因为我只能在这个 ODS 文件获取我想要的数据。使用 javascript 代码,我提取了三列并将其放入数组中:

const xlsx = require('xlsx');
let posts = [];
let post = {};
for(let i = 0; i < 1; i++){
    let filePath = `C:\\Users\\me\\Downloads\\file_users.ODS`;
    
    let workbook = xlsx.readFile(filePath);
    let worksheet = workbook.Sheets[workbook.SheetNames[0]];


    for (let cell in worksheet) {
        const cellAsstring = cell.toString();
        cellAsstring[0] === 'A' ? post['ID'] = worksheet[cell].v :
            cellAsstring[0] === 'C' ? post['USER NAME'] = worksheet[cell].v : null;
    
        if (cellAsstring[0] === 'J') {
            post['USER EMAIL'] = worksheet[cell].v;
            Object.keys(post).length == 3 ? posts.push(post) : null;
            post = {}
        }
    }
}

...返回:

{
    ID: '1','USER NAME': 'John Paul','USER EMAIL': '[email protected]'
  },{
    ID: '2','USER NAME': 'Julia','USER EMAIL': 'lejulie31312@outlook.com'
  },{
    ID: '3','USER NAME': 'Greg norton','USER EMAIL': 'thenorton[email protected]'
  },... 44660 more items

所以,我的问题是在处理大型 ODS 文件时。上面的返回是在使用此脚本和 78MB 文件时,并且使用 1.600MB 的 RAM。当我尝试将它与 900MB 文件一起使用时,我的内存达到了限制 (4000MB+) 并且出现错误'ERR_STRING_TOO_LONG'

我尝试使用 readline 包来解析数据,但它需要一个流。

如果我必须将 ODS 文件切成小块,我怎样才能在不使 vs 代码崩溃的情况下读取文件

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)