Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于单词作为键分隔符来读取文本文件的块?_Javascript_Arrays_Node.js_File_Lodash - Fatal编程技术网

Javascript 如何基于单词作为键分隔符来读取文本文件的块?

Javascript 如何基于单词作为键分隔符来读取文本文件的块?,javascript,arrays,node.js,file,lodash,Javascript,Arrays,Node.js,File,Lodash,我有一个.txt文件,格式如下: Part #368 - XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX

我有一个.txt文件,格式如下:

Part #368 - XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Part #369 - XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Part #370 - XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我是这样读文件的:

var lines = fs.readFileSync('file.txt', 'utf-8')
.split('\n')
.filter(Boolean);
所以它返回一个文件行数组。如何获取以“Part”字符串开头的文件块


类似于这样,但不是获取以“Part”开头的字符串,而是要从“Part”字符串到下一个“Part”字符串的所有行。

这将创建一个行数组

var parts = _.reduce(lines, function( result, line ) {
    if (line.indexOf('Part') !== -1) result.push([]);
    _.last(result).push(line);
    return result;
}, []);
JSON流 根据,下面是一个从扩展而来的类,该类将文件分隔为JSON数组流:

const { Transform } = require('stream');

class Delimited extends Transform {
  constructor({ delimiter = /\r?\n/g, encoding = 'utf8' } = {}) {
    super();

    // initialize internal values
    this._delimiter = delimiter instanceof RegExp ? delimiter : new RegExp(delimiter, 'g');
    this._encoding = encoding;
    this._buffer = '';
    this._first = true;
  }

  _transform(chunk, encoding, callback) {
    // convert input encoding into output encoding
    // and append to internal buffer
    if (encoding === 'buffer') {
      this._buffer += chunk.toString(this._encoding);
    } else if (encoding === this._encoding) {
      this._buffer += chunk;
    } else {
      this._buffer += Buffer.from(chunk, encoding).toString(this._encoding);
    }

    let partialJSON = '';

    // check if delimiter is found
    if (this._delimiter.test(this._buffer)) {
      // split internal buffer by delimiter
      let sections = this._buffer.split(this._delimiter);
      // put possibly incomplete section from array back into internal buffer
      this._buffer = sections.pop();
      // add each section to partial json array
      sections.forEach(section => {
        partialJSON += `${this._first ? '[' : ','}${JSON.stringify(section)}`;
        this._first = false;
      });
    }

    // push partial json array to readable stream
    callback(null, partialJSON);
  }

  _flush(callback) {
    // add remaining buffer as last section to json array
    callback(null, `${this._first ? '[' : ','}${JSON.stringify(this._buffer)}]`);
  }
}
用法示例:

const fs = require('fs');

let stream = fs.createReadStream('file.txt', 'utf8');
let transform = new Delimited({ delimiter: /\n\n(?=Part #\d)/g });
let json = '';

transform.on('data', (chunk) => json += chunk);
transform.on('end', () => console.log(JSON.parse(json)));

stream.pipe(transform);
const fs = require('fs');

let stream = fs.createReadStream('file.txt', 'utf8');
let transform = new Delimited(/\n\n(?=Part #\d)/g);
let array = [];

transform.on('data', (chunk) => array.push(chunk));
transform.on('end', () => console.log(array));

stream.pipe(transform);

串流 或者,如果您不希望将JSON传输到另一个文件、进程或作为客户端响应,则可以通过将输出流设置为
objectMode:true
,将每个部分作为块发送:

const { Transform } = require('stream');

class Delimited extends Transform {
  constructor(delimiter = /\r?\n/g) {
    super({ objectMode: true });

    // initialize internal values
    this._delimiter = delimiter instanceof RegExp ? delimiter : new RegExp(delimiter, 'g');
    this._encoding = 'utf8';
    this._buffer = '';
    this._first = true;
  }

  _transform(chunk, encoding, callback) {
    // convert input encoding into output encoding
    // and append to internal buffer
    if (encoding === 'buffer') {
      this._buffer += chunk.toString(this._encoding);
    } else if (encoding === this._encoding) {
      this._buffer += chunk;
    } else {
      this._buffer += Buffer.from(chunk, encoding).toString(this._encoding);
    }

    if (this._delimiter.test(this._buffer)) {
      // split internal buffer by delimiter
      let sections = this._buffer.split(this._delimiter);
      // put possibly incomplete section from array back into internal buffer
      this._buffer = sections.pop();
      // push each section to readable stream in object mode
      sections.forEach(this.push, this);
    }

    callback();
  }

  _flush(callback) {
    // push remaining buffer to readable stream
    callback(null, this._buffer);
  }
}
用法示例:

const fs = require('fs');

let stream = fs.createReadStream('file.txt', 'utf8');
let transform = new Delimited({ delimiter: /\n\n(?=Part #\d)/g });
let json = '';

transform.on('data', (chunk) => json += chunk);
transform.on('end', () => console.log(JSON.parse(json)));

stream.pipe(transform);
const fs = require('fs');

let stream = fs.createReadStream('file.txt', 'utf8');
let transform = new Delimited(/\n\n(?=Part #\d)/g);
let array = [];

transform.on('data', (chunk) => array.push(chunk));
transform.on('end', () => console.log(array));

stream.pipe(transform);

fs.readFileSync('file.txt','utf-8').split('Part')这样的东西就足够了吗?
对于Node.js中的转换流来说,这是一个非常好的用例。流将缓冲数据直到下一部分,然后一次性发出整个部分。(将流的可读部分置于对象模式。)最好处理此流,这样在做任何事情之前,您就不需要将整个文件缓冲到内存中。@Italoyers它可以工作,但它会切断“手”字符串。@Brad我知道时间晚了,但请查看我的答案。谢谢你的主意!概念上很好,但是最后一行用括号调用回调有什么用呢?还有,你为什么要从这里输出JSON呢?不要做自己的JSON序列化,这里不需要JSON。。。只需在对象模式下输出即可。@Brad其想法是在可写流结束时调用
\u flush()
,因此内部缓冲区中剩余的部分是最后一部分,因为在其中从未找到分隔符,因此在验证流结束时需要将其添加到
\u flush()
。如果它不是序列化的,那么使用这种转换就没有什么意义了。如果您希望整个数据最终都缓冲在内存中,那么在这种情况下,您也可以在正常流的末尾使用
.split(delimiter)
。这对于将JSON传输到另一个文件或客户端响应等更有用。@Brad I添加了
objectMode:true
流。我想这就是你的意思。