Muszę przekazać plik tekstowy do terminala, a następnie odczytać z niego dane, jak mogę to zrobić?
node server.js file.txt
Jak przejść ścieżką od terminala, jak to przeczytać po drugiej stronie?
Muszę przekazać plik tekstowy do terminala, a następnie odczytać z niego dane, jak mogę to zrobić?
node server.js file.txt
Jak przejść ścieżką od terminala, jak to przeczytać po drugiej stronie?
Odpowiedzi:
Będziesz chciał użyć process.argvtablicy, aby uzyskać dostęp do argumentów wiersza poleceń, aby uzyskać nazwę pliku i moduł FileSystem (fs) do odczytania pliku. Na przykład:
// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
console.log('Usage: node ' + process.argv[1] + ' FILENAME');
process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
, filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err;
console.log('OK: ' + filename);
console.log(data)
});
Aby trochę to załamać, process.argvzwykle będziesz mieć długość równą dwa, przy czym zerowa pozycja to interpreter „węzła”, a pierwsza to skrypt, który aktualnie działa w węźle, kolejne elementy są przekazywane w linii poleceń. Po pobraniu nazwy pliku z argv możesz użyć funkcji systemu plików do odczytania pliku i robienia wszystkiego, co chcesz z jego zawartością. Przykładowe użycie wyglądałoby tak:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Edytuj] Jak wspomina @wtfcoder, użycie metody " fs.readFile()" może nie być najlepszym pomysłem, ponieważ będzie buforować całą zawartość pliku przed przekazaniem go do funkcji wywołania zwrotnego. To buforowanie mogłoby potencjalnie zużywać dużo pamięci, ale co ważniejsze, nie wykorzystuje jednej z podstawowych funkcji node.js - asynchronicznego, zdarzonego wejścia / wyjścia.
Sposobem na „węzeł” przetwarzania dużego pliku (lub tak naprawdę dowolnego pliku) byłoby użycie fs.read()i przetworzenie każdego dostępnego fragmentu, który jest dostępny w systemie operacyjnym. Jednak odczytanie pliku jako takiego wymaga wykonania własnego (prawdopodobnie) przyrostowego analizowania / przetwarzania pliku i pewna ilość buforowania może być nieunikniona.
var lines = data.split(/\r?\n/);, wtedy tablica "linie" będzie zawierała każdy wiersz.
Użyj fs z node.
var fs = require('fs');
try {
var data = fs.readFileSync('file.txt', 'utf8');
console.log(data.toString());
} catch(e) {
console.log('Error:', e.stack);
}
IMHO, fs.readFile()należy unikać, ponieważ ładuje on WSZYSTKIE pliki do pamięci i nie wywoła wywołania zwrotnego, dopóki cały plik nie zostanie odczytany.
Najłatwiejszym sposobem odczytania pliku tekstowego jest przeczytanie go wiersz po wierszu. Polecam BufferedReader :
new BufferedReader ("file", { encoding: "utf8" })
.on ("error", function (error){
console.log ("error: " + error);
})
.on ("line", function (line){
console.log ("line: " + line);
})
.on ("end", function (){
console.log ("EOF");
})
.read ();
W przypadku złożonych struktur danych, takich jak pliki .properties lub json, należy użyć parsera (wewnętrznie powinien również używać buforowanego czytnika).
fs.readFile()lub fs.readFileSync(). Musi to być ogromny plik, aby spowodować zauważalne oczekiwanie. Plik konfiguracyjny JSON, taki jak package.json, prawdopodobnie będzie miał mniej niż 1 kb, więc możesz po prostu fs.readFile()i JSON.parse()tak.
Możesz użyć readstream i pipe, aby odczytać plik wiersz po wierszu bez wczytywania całego pliku do pamięci jednorazowo.
var fs = require('fs'),
es = require('event-stream'),
os = require('os');
var s = fs.createReadStream(path)
.pipe(es.split())
.pipe(es.mapSync(function(line) {
//pause the readstream
s.pause();
console.log("line:", line);
s.resume();
})
.on('error', function(err) {
console.log('Error:', err);
})
.on('end', function() {
console.log('Finish reading.');
})
);
Zamieszczam kompletny przykład, który w końcu działał. Tutaj czytam plik rooms/rooms.txtze skrypturooms/rooms.js
var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
data += chunk;
}).on('end', function() {
console.log(data);
});