Saya ingin membaca file yang sangat, sangat besar ke dalam array JavaScript di node.js.
Jadi, jika file seperti ini:
first line
two
three
...
...
Saya akan memiliki array:
['first line','two','three', ... , ... ]
Fungsi akan terlihat seperti ini:
var array = load(filename);
Oleh karena itu gagasan memuat semuanya sebagai string dan kemudian membaginya tidak dapat diterima.
javascript
node.js
chacko
sumber
sumber
Jawaban:
Jika Anda bisa memasukkan data akhir ke dalam sebuah array maka bukankah Anda juga bisa memasukkannya ke dalam sebuah string dan membaginya, seperti yang telah disarankan? Dalam hal apa pun jika Anda ingin memproses file satu baris pada satu waktu Anda juga dapat mencoba sesuatu seperti ini:
EDIT: (dalam menanggapi komentar oleh phopkins ) Saya pikir (setidaknya dalam versi yang lebih baru) substring tidak menyalin data tetapi membuat objek SlicedString khusus (dari pandangan sekilas pada kode sumber v8). Dalam hal apa pun di sini adalah modifikasi yang menghindari substring yang disebutkan (diuji pada file beberapa megabyte senilai "Semua pekerjaan dan tidak ada permainan membuat Jack menjadi anak yang membosankan"):
sumber
Sinkronis:
Asinkron:
sumber
Menggunakan Node.js modul readline .
sumber
\n
di akhir! Lihat: stackoverflow.com/questions/18450197/…js:
ts:
sumber
TypeError: fs.readFileSync(...).split is not a function
, Anda harus menggunakan .toString () seperti ini:var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
gunakan readline ( dokumentasi ). inilah contoh membaca file css, parsing untuk ikon dan menulisnya ke json
sumber
file.lines
dengan paket JFileSemu
Jangan lupa sebelumnya:
sumber
Dengan BufferedReader , tetapi fungsinya harus asinkron:
sumber
Saya hanya ingin menambahkan jawaban bagus @finbarr, sedikit perbaikan pada contoh asinkron:
Asinkron:
@MadPhysicist, done () adalah apa yang melepaskan async. panggilan.
sumber
Ini adalah variasi pada jawaban di atas oleh @mtomis.
Itu menciptakan aliran garis. Itu memancarkan 'data' dan 'mengakhiri' acara, memungkinkan Anda untuk menangani akhir aliran.
Gunakan sebagai pembungkus:
sumber
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);
lalu hitung berapa kali 'ujung' dipecat untuk masing-masingvar 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'); });
output: setiap baris dalam file teks dipecat satu kali untuk setiap instance. begitu juga 'akhir'.Saya memiliki masalah yang sama, dan saya telah menyelesaikannya dengan modul line-by-line
https://www.npmjs.com/package/line-by-line
Setidaknya bagi saya berfungsi seperti pesona, baik dalam mode sinkron maupun asinkron.
Juga, masalah dengan penghentian baris tidak berhenti \ n dapat diselesaikan dengan opsi:
Pemrosesan garis sinkron:
sumber
Menggunakan Node.js v8 atau yang lebih baru memiliki fitur baru yang mengubah fungsi normal menjadi fungsi async.
util.promisify
Ini fitur yang luar biasa. Berikut adalah contoh parsing 10.000 angka dari file txt ke dalam array, menghitung inversi menggunakan penggabungan gabung pada angka.
sumber
Untuk membaca file besar ke dalam array Anda dapat membaca baris demi baris atau potongan demi potongan.
baris demi baris merujuk pada jawaban saya di sini
chunk by chunk merujuk ke artikel ini
sumber