从文件中读取并查找特定行

时间:2017-01-20 15:42:53

标签: javascript node.js file split

我需要根据某些关键字在设置文件中获取信息(我无法更改格式)。文件是这样的:

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

系统为<key> = <value> \n。值部分中可以有=,空格或其他字符,但绝不会换行。密钥是唯一的(在“关键部分”中,它们可以显示在值中,但\nkey=只在文件中出现一次,用于每个密钥。)

使用shell脚本,我发现我的值如下:

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

Grep会返回username=someusername并且sed会替换密钥而=什么都没有,只留下值。

在node.js中,我想访问文件中部分的数据。例如,我想要地址和数据的值。

我怎么能在node.js中这样做?在fs.readFile(file.txt)之后我不知道该怎么做。我想我必须使用split,但使用\n似乎不是最好的选择,也许正则表达式可以帮助?

理想的做法是“找到以\nkey=开头并以第一个\n结尾的子字符串”,然后我可以轻松拆分以找到该值。

2 个答案:

答案 0 :(得分: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;
}

示例:

// 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"));

答案 1 :(得分:0)

使用splitreduce,您可以执行以下操作:

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;
    }, {});
  // ...
});

您的设置将作为键/值存储在settings对象中。