【问题标题】:How to make fs.readFile just back lines inner the scopes?如何使 fs.readFile 仅在范围内返回行?
【发布时间】:2018-12-21 13:15:51
【问题描述】:

我使用fs.readFile 并抛出data 并获取所有文件行,现在我只需要获取行内范围{}

代码如下:

//index.js
const fs = require('fs');
fs.readFile(process.argv[2], (err, data) =>  {
    if (err) throw err;
    console.log(`${data}`)
});


//app.scss
.app {
 color: black;
  .a {
      margin: 10px;
   }
}

用法

node index.js <CSS file directory> //dummy example

node index.js app.scss //real example

结果

//all file lines will print in console
.app {
 color: black;
  .a {
      margin: 10px;
   }
}

预期结果

color: black; 
margin: 10px;

但是这里data 是所有文件行,我只需要后行内部范围,有什么帮助吗?

【问题讨论】:

  • var lines = ''; data.split('\n').forEach(function(line){ if (line.indexOf('{') &lt; 0) lines += line + '\n' }); 所以用\n换行符分割数据并检查该行是否包含{
  • @Molda TypeError: data.split is not a function 显示此错误
  • 您将需要一个 javascript 中的 css 解析器,以实现您对各种 css 文件的需求。另一方面,如果您事先知道要阅读的 css 文件的结构,则可以通过简单的正则表达式匹配来完成

标签: javascript node.js scope


【解决方案1】:

创建一个接收文件所有行的函数,使用换行符(\n)进行拆分,以便我们可以逐行遍历,现在我们只添加一组验证以知道何时连接和何时不连接。

我留下这个函数操作的例子,它返回一个数组和一个字符串,我这样做是因为我不知道你需要什么样的输出。希望对你有用。

// index.js    
const fs = require('fs');

function getData(data) {
    let countOpenCurlyBraces = 0;
    let concatenate = null;
    let stringRes = '';
    const arrRes = [];
    const arr = data.split('\n');
    arr.forEach((element) => {
        if (countOpenCurlyBraces == 0) {
            concatenate = false;
        }
        if (element.includes('{')) {
            countOpenCurlyBraces++;
            concatenate = true;
            return;
        }
        if (element.includes('}')) {
            countOpenCurlyBraces--;
            return;
        }
        if (concatenate) {
            arrRes.push(element.trim());
            stringRes += element.trim() + '\n';
        }
    });
    return {
        arrRes,
        stringRes
    };
}

fs.readFile(process.argv[2], "utf8", (err, data) => {
    if (err) throw err;
    console.log(getData(data).stringRes);
});


// app.scss
//all file lines will print in console
.app {
 color: black;
  .a {
      margin: 10px;
   }
}

结果:

color: black;
margin: 10px;

【讨论】:

  • 那太好了,但是请你能像我通过 nodejs 一样从.css 文件中获取数据吗?
  • 是的,当然,我只是想知道您是否希望将答案打印在终端中?
  • 我已经将所有内容都更新了我的答案,我希望这是你所需要的。
猜你喜欢
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多