【问题标题】:Reading part of file in node在节点中读取部分文件
【发布时间】:2022-01-14 08:05:22
【问题描述】:

我在电子环境中的大型 .txt 文件中有 2 个 json 对象。正确的做法是:

  1. 读取文件中的第一个 json 对象
  2. 忽略第二个
  3. 以异步方式为每个文件循环此行为

这就是我访问包含 1 个 json 对象的文件的方式:

async readFile() {
        try{
        await fs.promises.access(filename, fs.constants.F_OK)
            try {
                const data = await fs.promises.readFile(`${dir}/${filename}`, 'utf8')
                let obj = JSON.parse(data)
                return obj
            }
            catch(err) {
                console.log(err)
            }
        } catch (err) {
            console.log("File Doesn\'t Exist. Creating new file.")
            fs.writeFile(filename, '', err => { err ? console.log(err) : null }) 
        }
    }

我考虑逐行阅读并检查第一个':'字符和'}'字符,解析这些行之间的内容并关闭文件。但是,它不适用于嵌套对象。

【问题讨论】:

    标签: javascript node.js json filestream


    【解决方案1】:

    我会使用 readstream 来读取块,然后逐个字符地检查,直到你有一个对象,定义为 { === } 的数量。像这样的:

    const fs = require("fs");
    
    async function read() {
      //TODO: add check for fileexists
      const obj = await findFirstJsonObjectFromFile("file.json");
    
      //TODO: convert to json object and return
      console.log(obj);
    }
    
    const findFirstJsonObjectFromFile = async fileName => {
      return new Promise(resolve => {
        const fileStream = fs.createReadStream(fileName, { highWaterMark: 60 });
        const jsonString = [];
        let started = 0;
        fileStream
          .on("error", () => resolve(jsonString.join("")))
          .on("end", () => resolve(jsonString.join("")))
          .on("data", chunk => {
            for (let i = 0; i < chunk.length; i++) {
              const a = String.fromCharCode(chunk[i]);
              jsonString.push(a);
              if (a === "{") {
                started++;
              } else if (a === "}" && started === 1) {
                resolve(jsonString.join(""));
              } else if (a === "}") {
                started--;
              }
            }
          });
      });
    };
    
    //TODO: loop over all files and send as parameter
    read();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 2017-02-05
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多