【问题标题】:node js automatically pull data from text files which are in foldersnode js自动从文件夹中的文本文件中提取数据
【发布时间】:2017-07-24 18:11:04
【问题描述】:

我是 nodejs 的新手。例如,我需要将文本文件中的数据提取到对象数组中。我有文件夹/Motobike,其中包含 4 个子文件夹:SportCrossCruiserChopper

每个此文件夹包含 3 个子文件夹:NewUsedRe-manufactured

每个文件夹包含 3 个文本文件:1.txt2.txt3.txt(摩托车评级)每个文件都包含一个摩托车名称​​(Honda, Yamaha等)和价格(1000、1500、3000等)

~/摩托车

  1. 运动

      • 1.txt
      • 2.txt
      • 3.txt
    • 使用
      • 1.txt
      • 2.txt
      • 3.txt
    • 再制造
      • 1.txt
      • 2.txt
      • 3.txt
  2. 交叉

  3. 巡洋舰
  4. 斩波器

示例 txt 文件

Honda:3400 
Yamaha:3000 
Kawasaki:2800 
Suzuki:2750

我希望我的应用程序自动将文本文件中的数据提取到对象数组中。谢谢你的帮助。

【问题讨论】:

  • 这是一个问答网站,不是让您完全完成工作的地方,您应该先自己尝试一下,如果需要可以提问
  • @ysytnik 你能添加一个.txt 文件内容的样例吗
  • @JonathanPortorreal Honda:3400 Yamaha:3000 Kawasaki:2800 Suzuki:2750

标签: javascript arrays node.js file directory


【解决方案1】:

使用 JSON 文件而不是 TXT 会有所帮助。 Javascript 具有轻松从 JSON 中提取数据的方法

https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON

【讨论】:

    【解决方案2】:

    这是一种从文件中获取数据作为数组中的对象的方法。我提供了最终结果的示例对象和一些您可能会弄乱的示例代码。

    样本对象

    [{
      bike: 'Chopper',
      type: 'New',
      data: {
        Honda: 3400,
        Yamaha: 3000,
        Kawasaki: 2800,
        Suzuki: 2750
      }
    }]
    

    示例代码

    const fs = require('fs');
    const path = require('path');
    
    const bikePaths = ["Chopper", "Cross", "Cruiser", "Sports"];
    const bikeTypes = ["New", "Re-manufactured", "Used"];
    
    function getFileAsObject(file, result) {
    
      let typeDir = path.dirname(file);
      let bikeDir = path.dirname(typeDir);
    
      return new Promise((resolve, reject) => {
        fs.readFile(file, 'utf8', (err, data) => {
          if (err)
            reject(err);
    
          let lines = data.split('\n').filter(line => line != '');
    
          let obj = lines.reduce((acc, line) => {
            let [key, value] = line.split(':');
    
            Object.assign(acc, {
              [key]: value
            })
    
            return acc;
          }, {});
    
          resolve({
            bike: path.basename(bikeDir),
            type: path.basename(typeDir),
            data: obj
          })
        })
      });
    }
    
    
    
    function readMotoBike(bikepaths, biketypes, result) {
    
      const flatten = arr => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
    
      let allPaths = bikepaths.map(bike => biketypes.map(type => {
        let currpath = bike + "/" + type;
    
        let pathToFile = path.format({
          root: './MotoBike/',
          base: currpath
        });
    
        let allFiles = fs.readdirSync(pathToFile);
    
        return allFiles.map(file => pathToFile + "/" + file);
    
      }));
    
      allPaths = flatten(allPaths);
    
      Promise.all(
        allPaths.map(file => {
          return getFileAsObject(file).then(res => {
            return res;
          });
        })
      ).then(result)
    }
    
    readMotoBike(bikePaths, bikeTypes, result => console.log(result))
    

    【讨论】:

    • @ysytnik 更新了代码,以便您可以在readMotoBike中获取对象数组作为回调
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多