Dieser Artikel wurde von einem Studenten aufgezeichnet, der JS anstelle eines Memos studiert. Erwarten Sie nicht den Inhalt.
Dieses Mal wird es unter Ubuntu gemacht, also starte die virtuelle Umgebung mit iTerm2.
Wo es angefangen hat
Wechseln Sie in das Verzeichnis, in dem Ubuntu installiert ist. vagrant up ist ein Befehl zum Starten von Ubuntu, das auf einem virtuellen PC installiert ist, und vagrant ssh stellt mit dem Vagrant Virtual Machine Set eine Verbindung zu SSH her.
'use strict';
const filesystem=require('fs');
const readline=require('readline');
const rs =fs.createReadStream('Dateiname');
const rl=readline.createInterface({input:rs, output:{}});
const prefectureDataMap = new Map();
rl.on('line', lines =>{
console.log(lines);
});
Die erste Zeile enthält eine Beschreibung für die Verwendung von JS im strengen Modus.
Die zweite und dritte Zeile rufen das Modul in Node.js mit require auf. require ist ein npm-Modul (Node Package Manager), mit dem Sie Erweiterungen verwenden können. Sie können einer Variablen ein Modul zuweisen und es in JS mit der folgenden Beschreibung verwenden.
Das Modul, das diesmal aufgerufen wird, ist fs (Dateisystem) zum Behandeln von Dateien und readline zum zeilenweisen Lesen von Dateien.
In der vierten Zeile wird die Datei mithilfe eines Streams gelesen und einer Variablen namens rs zugewiesen. Darüber hinaus verfügt das fs-Modul über Funktionen wie fs.readFileSync, die Daten synchron lesen.
Die 5. Zeile wird wie folgt mit einem Modul (Readline) eingestellt, das den Stream Zeile für Zeile lesen kann.
const rl = readline.createInterface({
//Festlegen des Streams, den Sie lesen möchten
input: rs,
//Einstellungen für den Stream, den Sie exportieren möchten
output: {}
});
In der 6. Zeile wird ein Map-Objekt verwendet, um eine Kombination aus Schlüsseln und Werten zu verarbeiten. Hier wird das Map-Objekt der Variablen zugewiesen und das Map-Objekt neu initialisiert.
Die 7. Zeile ist ein Objekt namens rl, das die folgende Funktion auslöst, wenn ein Ereignis namens line auftritt. Dieses Mal werden die Argumentzeilen auf der Konsole angezeigt.
Die an die on-Methode in der 6. Zeile übergebene Funktion wurde wie folgt geändert.
rl.on('line', lines => {
const cutline = lines.split(',');
const year = parseInt(cutline[0]);
const prefecture = cutline[1];
const popu = parseInt(cutline[3]);
if (year === 2010 || year === 2015) {
let vofmap = prefectureDataMap.get(prefecture);
if (!vofmap) {
vofmap = {
p10: 0,
p15: 0,
change: null
};
}
if (year === 2010) {
vofmap.p10 = popu;
}
if (year === 2015) {
vofmao.p15 = popu;
}
prefectureDataMap.set(prefecture, value);
}
});
Die split () -Methode in der zweiten Zeile teilt String in ein Array von Strings auf, indem sie durch den angegebenen Trennzeichenstring aufgeteilt wird. Die Verwendung der Methode ist wie folgt.
String.sprit(Angegebenes Trennzeichen)
Ab der 3. Zeile wird der Variablen ein Teil des aus der Zeichenfolge erstellten Arrays zugewiesen. parseInt () analysiert ein String-Argument und gibt einen ganzzahligen Wert des angegebenen Radix zurück (Basis der mathematischen Notation). Einfach ausgedrückt, was ein Zeichenfolgenwert war, wurde in eine Zahl (ganzzahliger Wert) geändert, um die Handhabung zu vereinfachen.
Ab der 6. Zeile wird das folgende Programm nur ausgeführt, wenn die Variable den mit der if-Anweisung angegebenen Wert hat.
In der 7. Zeile wird der Schlüsselwert abgerufen, während der Schlüssel auf der Karte angegeben wird. Siehe unten für das Schreiben
Kartenname.get(Schlüsselname);
Wenn in der 8. Zeile der für den Schlüsselnamen angegebene Wert nicht vorhanden ist, wird der dem Schlüsselnamen entsprechende Wert zum ersten Mal zugewiesen.
Ich werde diesen Teil nach der 9. Zeile erklären.
vofmap.p10 = popu;
}
if (year === 2015) {
vofmao.p15 = popu;
}
prefectureDataMap.set(prefecture, value);
}
});
Hier wird jedem Objekt der Wert zugewiesen, der dem zuvor im Map-Objekt erstellten Schlüsselnamen entspricht. Danach wird der Schlüssel- und Wertesatz in der vorherigen Karte registriert. Siehe unten für das Schreiben
Kartenname.set(Schlüsselname,Wert)
Der folgende Inhalt wird am Ende beschrieben.
rl.on('close', () => {
for (let [key, vofmap] of prefectureDataMap) {
vofmap.change = vofmap.popu15 / vofmap.popu10;
}
const rankingArray = Array.from(prefectureDataMap).sort((pair1, pair2) => {
return pair2[1].change - pair1[1].change;
});
const rankingStrings = rankingArray.map(([key, value]) => {
return (
key +
': ' +
value.popu10 +
':' +
value.popu15 +
':'+
value.change
);
});
console.log(rankingStrings);
});
Die erste Zeile ist dieselbe wie zuvor, und die folgende Funktion wird ausgelöst, wenn das Ereignis close als in dem Objekt rl auftritt.
In der 2. bis 4. Zeile wird die Syntax for ~ of verwendet, um den Schlüsselnamen und den entsprechenden Wert für die Map mit dem Namen prefectureDataMap zu wiederholen. Danach wird in der Karte ein neues Objekt namens change erstellt und der entsprechende Wert zugewiesen.
Die 5. Zeile wird nach Ausführung der Funktion in ein Array konvertiert. Dieses Mal wird sort verwendet, um die Reihenfolge entsprechend der Größe des Werts der Rückruffunktion zu ändern. Siehe unten für die Beschreibungsmethode.
Array.from(Conversion-Ziel,Funktion{})
Die 9. Zeile verwendet die Kartenfunktion. Es unterscheidet sich von dem, der den Schlüsselnamen usw. verwendet. Die Map-Funktion transformiert jedes Element des Arrays in den Inhalt, auf den die angegebene Funktion angewendet wird. Dieses Mal wird alles als Zeichenfolge konvertiert.
Knoten JS-Dateiname
Wenn das oben genannte ausgeführt wird und in REPL kein Fehler auftritt, ist es erfolgreich. Danke für deine harte Arbeit! !!
Wenn bei sehr großen Daten alle Daten gleichzeitig in den Speicher geladen werden, kann der Speicher knapp werden und die Leistung des Programms kann sich verschlechtern. Verwenden Sie in solchen Fällen Streams. Ein Stream kann Daten nach und nach lesen, schreiben und konvertieren.
Recommended Posts