Javascript 来自stdin的xlsx js解析
我正在尝试使用xlsx js(v0.8.0)解析一个文件,该文件通过stdin管道传输 以下代码:Javascript 来自stdin的xlsx js解析,javascript,node.js,xlsx,Javascript,Node.js,Xlsx,我正在尝试使用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:找不到central directo的结尾 ^错误:损坏的zip:在
const data = fs.readFileSync('/dev/stdin').toString();
wb = xlsx.read(data, {type: 'binary'});
将文件(在mac上)管道化为cat foo.xlsx | node test.js时失败:
```
抛出新错误(“损坏的zip:找不到central directo的结尾
^错误:损坏的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)
在Object.module.exports[作为加载]
(/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)
在Object.readSync[读取时]
(/Volumes/Macintosh_HD/Users/shauncutts/src/crane parse monthly/node_modules/xlsx/xlsx.js:11396:11)
但是,我可以通过以下方式读取相同的文件:
wb = xlsx.readFile(fn);
没有问题。我应该如何修改代码才能读取管道文件?再次感谢@LazarevAlexandr…事实上,问题在于。以下代码可以工作:
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处停止)。您是否尝试过设置二进制编码:
fs.readFileSync('/dev/stdin').toString('binary');
?@LazarevAlexandr——听起来很有希望,但是toString('binary')
和toString('ascii'))
worked…..fs.readFileSync(“/dev/stdin”)似乎有问题< /代码>:当读取为文件时,字符串为65536长度vs 1746435。这可能是在二进制数据中间的某个EOF字符中被卡住了,或者是65536的内部缓冲区大小?嗯……有什么建议吗?是的,最可能的问题是从文件中获取二进制字符串。尝试将<代码>二进制< /代码>编码作为OPT。readFileSync
的ion参数,不在其后面调用toString()
。如下所述: