xlsx-js синтаксический анализ из стандартного ввода

Я пытаюсь проанализировать файл с помощью xlsx-js (v0.8.0), который передается через стандартный ввод.

Следующий код:

const data = fs.readFileSync('/dev/stdin').toString();
wb = xlsx.read(data, {type: 'binary'});      

терпит неудачу, когда я передаю файл (на Mac) как cat foo.xlsx | узел 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) в Object.module.exports [как 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) в Object.readSync [как прочитано] (/Volumes/Macint osh_HD/Users/shauncutts/src/crane-parse-monthly/node_modules/xlsx/xlsx.js:11396:11)

Однако я могу прочитать тот же файл через:

wb = xlsx.readFile(fn);

Без проблем. Как мне изменить свой код, чтобы иметь возможность читать переданный файл?


person shaunc    schedule 25.11.2015    source источник
comment
Вы пытались установить двоичную кодировку: fs.readFileSync('/dev/stdin').toString('binary');?   -  person Alexandr Lazarev    schedule 25.11.2015
comment
@LazarevAlexandr -- звучит многообещающе, но ни toString('binary'), ни toString('ascii') не сработали....   -  person shaunc    schedule 26.11.2015
comment
Кажется, проблема с fs.readFileSync('/dev/stdin'): строка имеет длину 65536 против 1746435 при чтении в виде файла. -- возможно, это застревает на символе EOF где-то в середине двоичных данных? Или 65536 размер внутреннего буфера? Хм... есть предложения?   -  person shaunc    schedule 26.11.2015
comment
Да, скорее всего проблема в получении бинарной строки из файла. Попробуйте установить кодировку binary в качестве параметра опции readFileSync и не вызывать toString() после нее. Как описано здесь: nodejs.org/api/fs.html#fs_fs_readfilesync_file_options   -  person Alexandr Lazarev    schedule 26.11.2015


Ответы (1)


Еще раз спасибо @LazarevAlexandr ... на самом деле проблема в том, что readFile и readFileSync имеют проблемы со стандартным вводом . Работает следующий код:

  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...)
    });

(Примечание: пытались передать бинарную опцию readFileSync в тестах @mbostock, и они все равно остановились на 65535).

person shaunc    schedule 25.11.2015