【问题标题】:How can I parse a YAML file to read the comments as well using node.js?如何使用 node.js 解析 YAML 文件以读取评论?
【发布时间】:2020-03-05 03:49:01
【问题描述】:

我正在尝试解析 YAML 文件。我能够正确解析文件,但 YAML 文件中的 cmets 没有被读取。有什么办法吗?附加解析器代码和 config.json。还附上文件的截图和输出以供参考。

var fs= require('fs');
var path= require('path');
var yaml = require('js-yaml')

var fname= "config.json"
var jPath= path.join(__dirname,"..","ConfigGen","Config",fname);
var jsString= fs.readFileSync(jPath, 'utf8')

// Get path for files from Config file
var tType= "cto"                        //Get this from input
var pth= JSON.parse(jsString)[tType]    //perform error handling

var cType = "jbod"                      //Get this from input
//Use that path 
fs.readdir(pth, function(err,files) {
    files.forEach(function(file){
        fName= cType+"_"+tType+"_uut.yaml-example";
        if(file==fName){
            var flContent= fs.readFileSync(path.join(pth,file),"utf8")
            // return path.join from here and use the next part in a separate function
            var data= yaml.safeLoad(flContent)[0][0]
            console.log(data)
            for (var index in data){
                var prefix = index
                for (idx in data[index]){
                    //console.log(prefix, idx ,data[prefix][idx])
                }
            }

        }
    })
})

【问题讨论】:

  • YAML 规范 says„注释是一种表示细节,不得用于传达内容信息。“ 因此,大多数 YAML 实现(除了 ruamel ) 在解析器级别丢弃 cmets,因为如果不能使用它们的内容,为什么还要加载它们?
  • 我的问题是我想摄取一个文件,更新一个值,然后输出文件,与原始文件的唯一变化是更改后的值。是的,yaml 规范可能会说 cmets 可以被丢弃,但该文件也会被人类读取,他们不会喜欢丢失 cmets。

标签: javascript node.js yaml


【解决方案1】:

重申flyx's comment,根据YAML spec on comments

评论是一种演示细节,不得用于传达内容信息。

因此,假设您无法将 cmets 与任何相邻字段相关联,您可以将整个文件作为字符串读取并匹配 # 之后的任何字符

您可以像这样读取文件并使用this regex 进行解析:

var { promises: fs } = require('fs');

(async() => {
    let path = "./config.yaml"
    let file = await fs.readFile(path, "utf8")
    let matches = file.matchAll(/#.*/g)
    let comments = [...matches].map(m => m[0])
    console.log(comments)
})()

如果你有一个如下所示的 yaml 文件:

# block comment
env: dev
prop: value # inline comment

它将记录以下内容:

[ '# block comment', '# inline comment' ]

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 2013-06-05
    • 2012-07-12
    • 2018-05-27
    • 2020-10-14
    • 2020-07-18
    • 1970-01-01
    • 2019-06-23
    • 2013-03-17
    相关资源
    最近更新 更多