nodejs提取文件中特定内容

const path = require('path');
const fs = require('fs');
var iconv = require('iconv-lite');
// node执行路径
const dirPath = process.cwd();

// 判断是文件夹还是文件
const fileRead = filedir => {
  return new Promise((resolve, reject) => {
    fs.stat(filedir, function(err, stats) {
      if (err) {
        console.warn('获取文件stats失败');
        reject(err);
      } else {
        //文件
        const isFile = stats.isFile();
        // 文件夹
        const isDir = stats.isDirectory();
        if (isFile) {
          resolve(true);
        }
        if (isDir) {
          resolve(false);
        }
      }
    });
  });
};
// 判断文件后缀
function is_filetype(filename, types) {
  types = types.split(',');
  var pattern = '.(';
  for (var i = 0; i < types.length; i++) {
    if (0 != i) {
      pattern += '|';
    }
    pattern += types[i].trim();
  }
  pattern += ')$';
  return new RegExp(pattern, 'i').test(filename);
}
// 入口,content接收路径
const fileTra = content => {
  //根据文件路径读取文件,返回文件列表
  return new Promise((resolve, reject) => {
    fs.readdir(content, async function(err, files) {
      if (err) {
        console.warn(err);
        reject(err);
      } else {
        //遍历读取到的文件列表
        await fs.mkdir(path.join(dirPath), { recursive: true }, async err => {
          if (err) throw err;

          for (let i = 0; i < files.length; i++) {
            //获取当前文件的绝对路径
            const filedir = path.join(content, files[i]);
            //根据文件路径获取文件信息
            const isFile = await fileRead(filedir);
            // 如果是文件夹,递归遍历该文件夹下面的文件
            if (!isFile) {
              const backupPath = filedir.substr(
                filedir.indexOf('/指定文件名')
              );
              await fs.mkdir(
                path.join(dirPath, 'backupI8n', backupPath),
                { recursive: true },
                async err => {
                  await fileTra(filedir);
                }
              );
            } else {
              // 读取文件
              if (is_filetype(files[i], 'vue')) {
                const fileContent = fs.readFileSync(filedir);
                // console.log('fileContent', files[i]);
                await getChineseToArray(fileContent, filedir);
              }
            }
          }
        });
        resolve(files);
      }
    });
  });
};
async function getChineseToArray(content, filedir) {
  let obj = {};
  let strHead = '{',
    strEnd = '}',
    all = [];

  all.push(strHead);

  let str = iconv.decode(content, 'utf-8');

  // 代码按行分割出来
  let arr = str.split('\n');

  arr.forEach(async function(e, i) {
    if (
      e.indexOf('//') == -1 &&
      e.indexOf('console.log') == -1 &&
      e.indexOf('@param') == -1 &&
      e.indexOf('@brief') == -1
    ) {
      isChineseInit = true;
      var a = e.split('\n');
      a.forEach(async function(m) {
        if (
          m.indexOf('* ') == -1 &&
          m.indexOf(' * ') == -1 &&
          m.indexOf('/*') == -1 &&
          m.indexOf('<!--') == -1
        ) {
          const reg = /t\((.+?)\)/g;
          const ttreg = /tt\((.+?)\)/g;
          if (m.match(ttreg)) {
            var key = 'tt+' + String(m).split("'")[1];
            obj[key] = `${String(m).split("'")[1]}\n`;
          } else if (m.match(reg)) {
            var key = String(m).split("'")[1];
            obj[key] = `${String(m).split("'")[1]}\n`;
          }
        }
      });
    }
  }, this);

  const backupPath = filedir.substr(filedir.indexOf('/指定文件名'));

  for (let key in obj) {
    all.push('"' + key + '"' + ': ' + '"' + key + '"' + ',');
  }
  all.push(strEnd);
  const basePath = path.join(
    dirPath,
    'backupI8n',
    backupPath.replace('vue', 'json')
  );
  // flag: r只读,w可写,a追加
  fs.writeFileSync(basePath, all.join('\n'), { encoding: 'utf8', flag: 'w' });
}

fileTra('/Users/Documents/project/file/filename/src/views'); // 执行入口写路径

在同目录下新建backupI8n文件夹
效果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值