Gostaria de ler um arquivo muito, muito grande em uma matriz JavaScript no node.js.
Portanto, se o arquivo for assim:
first line
two
three
...
...
Eu teria a matriz:
['first line','two','three', ... , ... ]
A função ficaria assim:
var array = load(filename);
Portanto, a idéia de carregar tudo como uma string e depois dividi-la não é aceitável.
javascript
node.js
chacko
fonte
fonte
Respostas:
Se você pode ajustar os dados finais em uma matriz, também não poderá ajustá-los em uma string e dividi-los, como foi sugerido? De qualquer forma, se você deseja processar o arquivo uma linha de cada vez, também pode tentar algo como isto:
EDIT: (em resposta ao comentário de phopkins ) Acho que (pelo menos nas versões mais recentes) a substring não copia dados, mas cria um objeto SlicedString especial (a partir de uma rápida olhada no código-fonte da v8). De qualquer forma, aqui está uma modificação que evita a substring mencionada (testada em um arquivo de vários megabytes no valor de "Todo o trabalho e nenhuma diversão faz de Jack um garoto chato"):
fonte
Síncrono:
Assíncrono:
fonte
Usando o Node.js módulo readline .
fonte
\n
no final! Veja: stackoverflow.com/questions/18450197/…js:
ts:
fonte
TypeError: fs.readFileSync(...).split is not a function
, você deve usar .toString () assim:var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
use readline ( documentação ). aqui está um exemplo de leitura de um arquivo css, analisando ícones e gravando-os no json
fonte
file.lines
com pacote JFilePseudo
Não se esqueça antes:
fonte
Com um BufferedReader , mas a função deve ser assíncrona:
fonte
Eu só quero adicionar @finbarr ótima resposta, uma pequena correção no exemplo assíncrono:
Assíncrono:
@ MadPhysicist, done () é o que libera o assíncrono. ligar.
fonte
Esta é uma variação da resposta acima feita por @mtomis.
Ele cria um fluxo de linhas. Emite eventos 'data' e 'end', permitindo que você lide com o final do fluxo.
Use-o como um invólucro:
fonte
var EventEmitter = require('events').EventEmitter; var util = require('util'); function GoodEmitter() { EventEmitter.call(this); } util.inherits(GoodEmitter, EventEmitter);
var li1 = new LineStream(input1), li2 = new LineStream(input2);
e conte quantas vezes o 'final' é disparado para cada umvar fs = require('fs'); var input1 = fs.createReadStream('text.txt'); var ls1 = new LineStream(input1); ls1.on('data', function (line) { console.log('1:line=' + line); }); ls1.on('end', function (line) { console.log('1:fin'); }); var input2 = fs.createReadStream('text.txt'); var ls2 = new LineStream(input2); ls2.on('data', function (line) { console.log('2:line=' + line); }); ls2.on('end', function (line) { console.log('2:fin'); });
saída: cada linha no arquivo de texto foi acionada uma vez para cada instância. então foi 'fim'.Eu tive o mesmo problema e resolvi-o com o módulo linha por linha
https://www.npmjs.com/package/line-by-line
Pelo menos para mim funciona como um encanto, tanto no modo síncrono quanto assíncrono.
Além disso, o problema com as linhas terminando e não terminando \ n pode ser resolvido com a opção:
Processamento síncrono de linhas:
fonte
O uso do Node.js v8 ou posterior possui um novo recurso que converte a função normal em uma função assíncrona.
util.promisify
É um recurso incrível. Aqui está o exemplo de análise de 10000 números do arquivo txt em uma matriz, contando inversões usando a classificação de mesclagem nos números.
fonte
Para ler um arquivo grande na matriz, você pode ler linha por linha ou pedaço por pedaço.
linha por linha, consulte a minha resposta aqui
pedaço por pedaço consulte este artigo
fonte