我尝试使用xlsx-js(v0.8.0)解析文件,该文件通过stdin传送。
以下代码:
const data = fs.readFileSync('/dev/stdin').toString();
wb = xlsx.read(data, {type: 'binary'});
当我将文件(在mac上)管道化为cat foo.xlsx |时,失败node test.js:
```
抛出新的错误("损坏的zip:无法找到中央指挥的结尾 ^错误:损坏的zip:无法在Object.ZipEntries.readEndOfCentral找到中心目录的末尾 (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:135:19) 在Object.ZipEntries.load (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:197:14) 在Object.ZipEntries (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/zipEntries.js:21:14) at Object.module.exports [as load] (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/load.js:11:18) 在Object.JSZip (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/jszip/lib/index.js:39:14) 在read_zip (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/xlsx/xlsx.js:11375:38) at Object.readSync [as read] (/Volumes/Macintosh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/xlsx/xlsx.js:11396:11)
但是,我可以通过以下方式阅读相同的文件:
wb = xlsx.readFile(fn);
没有问题。我应该如何修改我的代码以便能够读取管道文件?
答案 0 :(得分:1)
再次感谢@LazarevAlexandr ......实际上问题是readFile & readFileSync have problems with stdin。以下代码有效:
let wb;
const chunks = [];
process.stdin
.on("data", function(chunk) { chunks.push(chunk); })
.on("end", function() {
const buffer = Buffer.concat(chunks);
wb = xlsx.read(buffer, {binary: true});
// (call your favorite async continuation method here...)
});
(注意 - 尝试在@ mbostock的测试中将二进制选项传递给readFileSync,它们仍然停在65535处。)