【问题标题】:Nodejs fs module: How to readFile and create json object?Nodejs fs 模块:如何读取文件并创建 json 对象?
【发布时间】:2018-10-29 00:11:53
【问题描述】:

我正在从文件中读取以下数据,现在我想从中创建 json 对象,如何使用 nodejs fs 模块创建它?

app.js

var path = "./ditLogs/" + file;
                fs.readFile(path, function(err, data) {
                   console.log('reading file data', data.toString());
                });

这是文件中的数据,我需要为其创建 json

文件.txt

{"event":"test data"}
{"event":"test data"}
{"event":"test data"}

【问题讨论】:

  • .split("\n").map(a=>JSON.parse(a))?

标签: javascript json node.js


【解决方案1】:

你可以使用这个示例函数:

function(strFromFile) {
  try {
    return JSON.parse(strFromFile);
  } catch(e) {
    return {};
  }
};

【讨论】:

    【解决方案2】:

    FS 模块

    在使用 NodeJS 进行开发时,有时需要访问计算机的文件系统。 FS Module 是一个可协助完成此过程的实用程序。

    FS 包含一些函数,允许通过 API 的包装器在文件系统上完成不同的活动。

    这应该包含/需要/导入到任何需要与文件系统 API 交互的 JS 中。

    var fs = require("fs");
    

    这些是您可以在此 API 上使用的不同方法,它们都是异步的:

    fs.readFile {fs.readFile('input.txt', function(err, data)

    // Asynchronous read
    fs.readFile('input.txt', function (err, data) {
       if (err) {
          return console.error(err);
       }
       console.log("Asynchronous read: " + data.toString());
    });
    

    fs.writeFile

    fs.writeFile('input.txt', 'Simply Easy Learning!',  function(err) {
       if (err) {
          return console.error(err);
       }
    
       console.log("Data written successfully!");
       console.log("Let's read newly written data");
       fs.readFile('input.txt', function (err, data) {
          if (err) {
             return console.error(err);
          }
          console.log("Asynchronous read: " + data.toString());
       });
    });
    

    打开

    // Asynchronous - Opening File
    console.log("Going to open file!");
    fs.open('input.txt', 'r+', function(err, fd) {
       if (err) {
          return console.error(err);
       }
      console.log("File opened successfully!");    
    });
    

    fs.stat(提供有关文件的信息)例如

    fs.stat('input.txt', function (err, stats) {
       if (err) {
           return console.error(err);
       }
       console.log(stats);
       console.log("Got file info successfully!");
    
       // Check file type
       console.log("isFile ? " + stats.isFile());
       console.log("isDirectory ? " + stats.isDirectory());   
    });
    

    fs.read(类似于readFile,不应该是读取文件的首选)

    fs.close

    // Close the opened file.
    fs.close(fd, function(err){
      if (err){
         console.log(err);
      }
         console.log("File closed successfully.");
    });
    

    ftruncate(截断打开的文件)

    取消链接(删除打开的文件)

    fs.unlink('input.txt', function(err) {
       if (err) {
          return console.error(err);
       }
       console.log("File deleted successfully!");
    });
    

    fs.mkdir(新建目录)

    fs.mkdir('/tmp/test',function(err){
       if (err) {
          return console.error(err);
       }
       console.log("Directory created successfully!");
    });
    

    fs.readdir(读取目录)

    fs.readdir("/tmp/",function(err, files){
       if (err) {
          return console.error(err);
       }
       files.forEach( function (file){
          console.log( file );
       });
    });
    

    fs.rmdir(删除目录)

    fs.rmdir("/tmp/test",function(err){
       if (err) {
          return console.error(err);
       }
       console.log("Going to read directory /tmp");
    
       fs.readdir("/tmp/",function(err, files){
          if (err) {
             return console.error(err);
          }
          files.forEach( function (file){
             console.log( file );
          });
       });
    });
    

    同步函数:

    读取文件同步

    // Synchronous read
    var data = fs.readFileSync('input.txt');
    console.log("Synchronous read: " + data.toString());
    

    writeFileSync

    // Synchronous write
    var data = fs.writeFileSync('input.txt', 'asdasdasd');
    

    【讨论】:

      【解决方案3】:

      使用逐行包简单地读取,更少的头痛,对读取过程的更多控制(它可以暂停、恢复读取、按需关闭文件描述符、跳过 N 行)用更少的代码。

      1) 安装:

      npm i --save line-by-line
      npm i --save lodash
      

      2) 实施

      var lineByLine = require('line-by-line'),
          _ = require('lodash'),
          path = require('path');
      
      
      var lines = [];
      var filePath = path.join(__dirname, "ditLogs", file);
      var fileReader = new lineByLine(filePath);
      
      fileReader.on('line', function(line) {
        line = JSON.parse(line);
        if(_.isPlainObject(line) && !_.isEmpty(line)) {
          lines.push(line);
        }
      
        // optional
        doSomethingWithLine(line);
      });
      
      function doSomethingWithLine(line) {
        // for example You can save to db or send to somewhere using request libary or just show in console
      }
      
      fileReader.on('error', function(error) {
        console.error(error);
        process.exit(-1);
      });
      
      fileReader.on('end', function() {
        doSomethingAfterParsingAllLines(lines);
      });
      
      function doSomethingAfterParsingAllLines(records) {
        // do something with data
      }
      

      【讨论】:

      • 某个聪明人对我的回答投了反对票,但没有说明原因。不公平! (:
      【解决方案4】:
      'use strict';
      const fs = require('fs');
      let rawdata = fs.readFileSync('student.json');  
      let student = JSON.parse(rawdata);  
      console.log(student);  
      

      【讨论】:

      • 您能否详细说明您的答案中有哪些新内容?还有其他现有的答案可以更好地解释这一点。
      猜你喜欢
      • 2020-06-12
      • 2021-04-04
      • 2017-09-21
      • 2021-07-11
      • 2019-08-26
      • 2018-08-08
      • 2022-11-27
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多