【问题标题】:How to get required type of files from a directory and required content using node js?如何使用 node js 从目录中获取所需类型的文件和所需内容?
【发布时间】:2017-02-19 16:42:47
【问题描述】:

我正在开发 node js 应用程序来单独从 XML 或 HTML 文件中提取一些内容。我正在使用Windows机器。一些 Npm 包只能在苹果或 Linux 机器上运行,我无法使用它。我试图从一个目录中单独获取特定文件,因为该目录包含多个文件。

例如,文件名为 project1.abi.xml、project1.xbi.xml、project2.abi.xml、project2.xbi.xml、new\xxcover.html。

首先,我希望单独获取 *.abi.xml 文件。其次,我希望单独获得 *.xbi.xml。第三,*cover.html。但是,我可以使用 readdirSync 获取目录中的所有文件。然后检查是否需要循环文件,然后执行我需要的功能。

var fs = require('fs');
var path = 'D:\\Work\\Testing\\logs\\';
var files = fs.readdirSync(path);
var len;
for (index = 0, len = files.length; index < len; index++) {
    if (files[index].indexOf('xbi.xml') !== -1) {        
          console.log(path+files[index]); 
    }
}

为避免这种情况,有没有办法在循环之前从目录中获取特定类型的文件?有人可以指导我吗?

另外,我正在尝试使用节点 js 中的正则表达式从 html 文件中获取“总警告”计数 (216)。我得到的结果是未定义的。下面是我的代码。你能指出我在哪里犯了错误以纠正它吗?

HTML 内容

<body>
<h1>2017 report</h1>
<dl>
<dt>Source Directory:</dt>
<dd>F:\ion\ket\Automation\App</dd>
    <dt>Settings File:</dt>
    <dd>F:\ion\ket\Automation\App\Net.json, F:\ion\ket\Automation\App\Net.Debug.json</dd>
    <dt>Processed Files:</dt>
    <dd>30</dd>
    <dt>Files with Warnings:</dt>
    <dd>0</dd>
    <dt>Total Warnings:</dt>
    <dd>216</dd>
</dl>

代码:

var fs = require('fs');
var path = 'C:\\Users\\akil\\Desktop\\App.Net.html';
var files = fs.readFileSync(path, 'utf-8');
var re = new RegExp('/<dt>Total Warnings:</dt>\s+<dd>(?![\s\S]*</dd>)/');
var r  = files.match(re);
if (r)
    console.log(r[1]);
console.log(r);

谢谢。

【问题讨论】:

    标签: javascript regex node.js xml


    【解决方案1】:

    如果你想按扩展名过滤文件,你可以试试 array.filter 函数。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

    例子

    var allFiles = fs.readdirSync(path);
    var filteredFiles = allFiles.filter(function(value) {
        var extension = 'xbi.xml';
        return value.endsWith(extension);
    });
    

    关于您的 regex 问题:

    • 正如@siam 正确指出的那样,JavaScript RegEx 需要反斜杠 escaped 作为\\
    • 我假设,您希望找到一个“总警告”计数作为一个数字。所以我建议寻找一系列数字 (\d*)。

    此正则表达式应与您的示例匹配:

    var re = new RegExp('<dt>Total Warnings:</dt>\\s+<dd>\\d*</dd>');
                                                         ^
    

    这有帮助吗?

    【讨论】:

    • 有趣。在我的编辑器中,正则表达式与示例匹配。在节点中它仍然返回null
    • @KonstantinA.Magg 尝试在sd 之前添加双反斜杠“\\”
    • 谢谢,@siam。最后是那个一个;-)
    • @KonstantinA.Magg,谢谢。终于奏效了。 var re = new RegExp('
      Total Warnings:
      \\s+
      (.*)
      ');
    • @siam,谢谢。终于奏效了。 var re = new RegExp('
      Total Warnings:
      \\s+
      (.*)
      ');
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2017-11-26
    • 2013-09-21
    • 1970-01-01
    • 2015-03-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多