2017-01-20 21 views
1

Ich muss Informationen in den Einstellungen einer Datei abrufen (ich kann das Format nicht ändern) nach bestimmten Schlüsselwörtern. Die Datei sieht wie folgt aus:Aus Datei lesen und bestimmte Zeilen finden

username=myusername 
address=156a1355e3486f4 
data=function(i){if (i!=0) return true; else return false;} 

Das System ist <key>=<value>\n. Es kann =, Leerzeichen oder andere Zeichen im Wertteil sein, aber niemals Zeilenumbrüche. Schlüssel sind eindeutig (im "Schlüsselteil" können sie in Werten vorkommen, aber \nkey= erscheint nur einmal in der Datei für jeden Schlüssel).

mit einem Shell-Skript, finde ich meine Werte wie folgt aus:

username=`grep ^username file.txt | sed "s/^username=//"` 

Grep username=someusername zurück und sed ersetzt den Schlüssel und = mit nichts, nur den Wert zu verlassen.

In node.js möchte ich auf einige der Daten in der Datei zugreifen. Zum Beispiel möchte ich den Wert für Adresse und Daten.

Wie könnte ich das in node.js tun? Nach fs.readFile(file.txt) weiß ich nicht, was zu tun ist. Ich denke, ich muss split verwenden, aber mit \n scheint nicht die beste Option zu sein, kann Regex vielleicht helfen?

Die ideale Sache wäre, "einen Teilstring beginnend mit \nkey= und endend mit dem ersten \n" zu finden, dann könnte ich leicht teilen, um den Wert zu finden.

+0

Möchten Sie es in ein Objekt analysieren? Das wäre einfach. –

Antwort

1
// @text is the text read from the file. 
// @key is the key to find its value 
function getValueByKey(text, key){ 
    var regex = new RegExp("^" + key + "=(.*)$", "m"); 
    var match = regex.exec(text); 
    if(match) 
     return match[1]; 
    else 
     return null; 
} 

Beispiel:

// text should be obtained using fs.readFile... 
 
var text = "username=myusername\naddress=156a1355e3486f4\ndata=function(i){if (i!=0) return true; else return false;}"; 
 

 

 
function getValueByKey(text, key){ 
 
    var regex = new RegExp("^" + key + "=(.*)$", "m"); 
 
    var match = regex.exec(text); 
 
    if(match) 
 
     return match[1]; 
 
    else 
 
     return null; 
 
} 
 

 
console.log("adress: ", getValueByKey(text, "address")); 
 
console.log("username: ", getValueByKey(text, "username")); 
 
console.log("foo (non exist): ", getValueByKey(text, "foo"));

+0

Danke! Ich wusste, dass Regex der richtige Weg war. Das Schreiben meiner Frage hat mir geholfen, eine Lösung zu finden (nicht so sauber und anpassungsfähig wie deine), mit 'text.match (regex)', das Schreiben der "idealen Sache" Teil hat mir ziemlich viel Regex gegeben. –

0

Mit split und reduce, können Sie so etwas tun:

fs.readFile('file.txt', { encoding : 'utf8' }, data => { 
    const settings = data 
    .split('\n') 
    .reduce((obj, line) => { 
     const splits = line.split('='); 
     const key = splits[0]; 
     if (splits.length > 1) { 
     obj[key] = splits.slice(1).join('='); 
     } 
     return obj; 
    }, {}); 
    // ... 
}); 

Ihre Einstellungen werden als Schlüssel/Wert im Objekt settings gespeichert.

Verwandte Themen