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?
javascript
node.js
fantazyjny
źródło
źródło
Odpowiedzi:
Będziesz chciał użyć
process.argv
tablicy, aby uzyskać dostęp do argumentów wiersza poleceń, aby uzyskać nazwę pliku i moduł FileSystem (fs) do odczytania pliku. Na przykład:Aby trochę to załamać,
process.argv
zwykle 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:[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.źródło
var lines = data.split(/\r?\n/);
, wtedy tablica "linie" będzie zawierała każdy wiersz.Użyj fs z node.
źródło
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 :
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).
źródło
fs.readFile()
lubfs.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 prostufs.readFile()
iJSON.parse()
tak.Możesz użyć readstream i pipe, aby odczytać plik wiersz po wierszu bez wczytywania całego pliku do pamięci jednorazowo.
źródło
Zamieszczam kompletny przykład, który w końcu działał. Tutaj czytam plik
rooms/rooms.txt
ze skrypturooms/rooms.js
źródło