繁体   English   中英

如何使用 node.js 读取一系列 JavaScript 文字?

[英]how do I read a series of JavaScript literals with node.js?

我有一个看起来像的日志文件

日志.txt

{ timestamp: '2019-10-24 04:39:26',
     referer: 'websocket',
     switch:
      { program:
         'elephant',
        preview: 'gopher',
        id: 1571891966523 } } }
{ 'switch-type': 'non-buffered',
     'switch-time': 17,
     'preview-loaded': 477,
     'video-loaded': 345 } }
{ timestamp: '2019-10-24 04:39:35',
     referer: 'websocket',
     switch:
      { program: 'gopher',
        preview: 'camel',
        id: 1571891975677 } } }
{ 'switch-type': 'pre-buffered',
     'switch-time': 15,
     'preview-loaded': 348 } }
{ timestamp: '2019-10-24 04:39:37',
     referer: 'websocket',
     switch:
      { program: 'camel',
        preview:
         'elephant',
        id: 1571891977697 } } }
{ 'switch-type': 'non-buffered',
     'switch-time': 14,
     'preview-loaded': 302,
     'video-loaded': 203 } }
...

该日志文件是由一个长期运行的 node.js 脚本生成的,该脚本定期执行

// logging script
...
console.dir(data);
...

我想要一个 node.js 脚本来解析该日志文件并给我一个快速总结。 该 node.js 脚本目前类似于

// analyze_logs.js
var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));

我得到了错误:

JSONDecodeError: Expecting property name enclosed in double quotes

如何使用 node.js 漂亮地打印 JSON 上的评论? 让我意识到上述格式不是(一系列)严格的 JSON 格式。

它是“ 像 JSON,除了没有引号的键”。

  1. 如何读取从 console.dir() 打印的数据,无论格式如何,从文本文件到我的 node.js 脚本,并将其解析回正常的 JavaScript object?

  2. 当文本文件有一长串这样的对象时,我如何一次读取一个? (似乎有一些JSON 流媒体读取一系列 JSON 对象,例如npm 流 json ,但它们似乎需要日志记录脚本才能发出严格的 JSON。

也许这不是最好的方法,但它可以工作。

  1. 将日志文件拆分为代表单个对象的块:看到上面的日志文件示例,我认为我们可以假设以没有空格开头的行开始一个新的 object。 因此,您可以在文件内容上逐行 go,将这些行连接成一个字符串,如果您找到一个开始新 object 的行,则开始一个新字符串。

  2. 一旦你有一个像这样的 object 表示的字符串,你可以使用eval来解释它。 因为我们知道这是有效的 JS 代码(实际上你必须删除最后一个} ),我们只需通过添加一个虚拟变量将其转换为赋值,然后eval将返回我们的 object:

const obj = eval(`whatever = { timestamp: '2019-10-24 04:39:26',
     referer: 'websocket',
     switch:
      { program:
         'elephant',
        preview: 'gopher',
        id: 1571891966523 } }`); // here I removed the last }
console.log(obj.switch.program); // prints elephant

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM