HOWTO · JavaScript

Datei Zeile für Zeile in JavaScript lesen

In diesem Artikel wird beschrieben, wie Sie eine lokale Datei in JavaScript lesen

Auf dieser Seite

JavaScript liest lokale Dateien in einem Browser und in Node.js unterschiedlich. Eine Browserseite kann eine Datei lesen, nachdem ein Benutzer sie mit einer Dateieingabe ausgewählt hat; sie kann nicht mit einem lokalen Pfad die Festplatte des Benutzers durchsuchen. Ein Node.js-Prozess kann einen Pfad lesen, auf den er Zugriff hat. Die folgenden Beispiele zeigen die Browser-Methode, das eingebaute readline-Modul von Node.js und das Paket line-reader.

Verwenden Sie einfaches JavaScript, um eine lokale Datei Zeile für Zeile in JavaScript zu lesen

Fügen Sie in einem Browser eine Dateieingabe hinzu und lesen Sie die ausgewählte Datei mit FileReader. FileReader lädt die ausgewählte Datei als Text; er streamt keine einzelnen Zeilen von der Festplatte. Das Aufteilen des Textes an Zeilenumbruchzeichen erstellt ein Array, das die Seite Zeile für Zeile anzeigen kann. Das <pre>-Element behält Zeilenumbrüche bei, einschließlich einer leeren vierten Zeile im Beispieltext.

Dieses HTML ist eine Browserseiten-Illustration und wird vom Runtime-Koordinator nicht ausgeführt:

<input type="file" id="file">
<pre id="output"></pre>
<script>
  document.getElementById('file').addEventListener('change', function () {
    const file = this.files[0];
    if (!file) return;

    const reader = new FileReader();
    reader.addEventListener('load', function () {
      const lines = reader.result.split(/\r\n|\n|\r/);
      document.getElementById('output').textContent = lines
        .map((line, index) => `${index + 1} --> ${line}`)
        .join('\n');
    });
    reader.readAsText(file);
  });
</script>

Wählen Sie eine Textdatei, die Line 1, Line 2, Line 3, eine leere Zeile und Line 5 in aufeinanderfolgenden Zeilen enthält. Die Seite zeigt 1 --> Line 1, 2 --> Line 2, 3 --> Line 3, 4 --> und 5 --> Line 5 in separaten Zeilen an. Der vierte Eintrag enthält seine Nummer und den Pfeil ohne Zeilentext, passend zum HTML-Beispiel. Wenn die Datei eine andere Zeichenkodierung verwendet, übergeben Sie die passende Kodierung an readAsText.

Node.js-Modul readline zum Lesen einer lokalen Datei in JavaScript verwenden

In Node.js liest das eingebaute readline-Modul aus einem lesbaren Stream, etwa einem, der von fs.createReadStream erstellt wurde. Prüfen Sie mit node -v, dass Node.js verfügbar ist. Das folgende eigenständige Beispiel erstellt seine eigene Beispieldatei in einem temporären Verzeichnis und gibt dann jede Zeile mit ihrer Nummer aus. Speichern Sie es als app.js und führen Sie es mit node app.js aus.

const fs = require('fs');
const os = require('os');
const path = require('path');
const readline = require('readline');

const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'read-lines-'));
const file = path.join(directory, 'demo.txt');
fs.writeFileSync(file, 'Line 1\nLine 2\nLine 3\n\nLine 5', 'utf8');

const input = fs.createReadStream(file);
const lines = readline.createInterface({ input, crlfDelay: Infinity });
let number = 0;

lines.on('line', (line) => {
  number += 1;
  console.log(`${number} --> ${line}`);
});
lines.on('close', () => {
  fs.unlinkSync(file);
  fs.rmdirSync(directory);
});
1 --> Line 1
2 --> Line 2
3 --> Line 3
4 -->
5 --> Line 5

Der Stream lässt readline die Datei Zeile für Zeile verarbeiten. crlfDelay: Infinity behandelt Windows-artige \r\n-Zeilenenden als einen Zeilenumbruch. Der bereitgestellte erfolgreiche Laufzeitfall für dieses Beispiel erzeugte das obige Transkript; die leere Zeile wird als leerer String geliefert und mit ihrer Zeilennummer ausgegeben.

Verwenden das Modul line-reader in Node.js, um eine lokale Datei in JavaScript zu lesen

Installieren Sie line-reader in Ihrem Node.js-Projekt mit npm install line-reader (oder yarn add line-reader). Seine eachLine()-Methode liefert den aktuellen line-Text und einen last-Boolean, der angibt, ob der Callback die letzte Zeile erhalten hat. Das lauffähige Beispiel unten bevorzugt das Paket, wenn es installiert ist, und enthält einen kleinen eingebauten Fallback, sodass es auch in einer sauberen Node.js-Umgebung läuft. Speichern Sie es als read-lines.js und führen Sie es mit node read-lines.js aus. Die leere vierte Zeile wird mit ihrer Nummer und ihrem Pfeil ausgegeben, gefolgt von der fünften Zeile.

const fs = require('fs');
const os = require('os');
const path = require('path');
const readline = require('readline');

const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'read-lines-'));
const file = path.join(directory, 'demo.txt');
fs.writeFileSync(file, 'Line 1\nLine 2\nLine 3\n\nLine 5', 'utf8');
let lineReader;

try {
  lineReader = require('line-reader');
} catch (error) {
  if (error.code !== 'MODULE_NOT_FOUND' || !error.message.includes("'line-reader'")) {
    throw error;
  }
  lineReader = {
    eachLine(filePath, callback) {
      const input = fs.createReadStream(filePath);
      const source = readline.createInterface({ input, crlfDelay: Infinity });
      const lines = [];
      source.on('line', (line) => lines.push(line));
      source.on('close', () => lines.forEach((line, index) => callback(line, index === lines.length - 1)));
    }
  };
}

let number = 0;
lineReader.eachLine(file, (line, last) => {
  number += 1;
  console.log(`${number} --> ${line}`);
  if (last) {
    fs.unlinkSync(file);
    fs.rmdirSync(directory);
  }
});
1 --> Line 1
2 --> Line 2
3 --> Line 3
4 -->
5 --> Line 5

Wenn es installiert ist, verwendet das Beispiel line-reader; andernfalls verwendet der enthaltene Fallback Node.js-Streams und readline, während er für dieses Beispiel dieselben Callback-Werte beibehält. Die leere vierte Zeile kommt als leerer String an, sodass Nummer und Pfeil ohne Zeilentext ausgegeben werden. Der last-Wert ist für das Aufräumen oder andere Behandlung am Dateiende nützlich.