zoukankan      html  css  js  c++  java
  • node 读取多个文件、合并多个文件、读写多个文件

    一、读取文件

    1、找文件中匹配的内容
    let fs = require('fs')
    let content = fs.readFileSync('/Users/**/desktop/Test.txt', 'utf-8')
    console.log(content.match(/uD83C[uDF00-uDFFF]|uD83D[uDC00-uDE4F]/g))

    2、读取文件并合并两个文件内容
    var fs = require('fs');
    let content = fs.readFileSync('/Users/**/desktop/mark.log', 'utf-8')
    fs.appendFile('/Users/caofan/desktop/Test.txt', content, function (err) {
        if (err) throw err;
        console.log('The "data to append" was appended to file!');
    });
    3.按行读取单个文件
    var readline = require('readline');
    var fs = require('fs');
    var os = require('os');
    
    var fReadName = '/Users/**/desktop/title/title_20171101.log';
    var fWriteName = './emoji1.csv';
    var fRead = fs.createReadStream(fReadName);
    var fWrite = fs.createWriteStream(fWriteName);
    var enableWriteIndex = true;
    
    var objReadline = readline.createInterface({
        input: fRead
    });
    
    var index = 1;
    var matchArr = [];
    
    objReadline.on('line', (line)=>{
        if (enableWriteIndex) {
            if(line.match(/uD83C[uDF00-uDFFF]|uD83D[uDC00-uDE4F]/g)){
                matchArr.push(index)
                var tmp = line;
                fWrite.write(tmp + os.EOL);
                // if (matchArr.length <= 10) {      //输出匹配的前10条
                //     console.log(line)
                //     // fs.writeFileSync(fWriteName, line+ '
    ', 'utf8');
                //     var tmp = 'line' + matchArr.length + ':' + line;
                //     fWrite.write(tmp + os.EOL);   //  将匹配的前10条写入另一个文件 
                // }
            }
            index ++;
        }
    });
    
    fRead.on('end', ()=>{
        enableWriteIndex = false;
        console.log(matchArr.length)  // 总共匹配的条数
    });
    
    objReadline.on('close', ()=>{
    });
    4. 合并目录下的多个文件到另一个文件
    var fs = require("fs");
    var path = require('path');
    //配置远程路径
    var remotePath = "./emoji";  // 相对路径
    //读取文件目录
    fs.readdir(remotePath,function(err,files){
        if(err){
            console.log(err);
            return;
        }
        files.forEach(function(filename){
            var filedir = path.join(remotePath,filename);
            fs.stat(filedir,function(err, stats){
                if (err) throw err;
                if(stats.isFile()){
                    if(/emoji/.test(filename)) {
                         console.log(filename)
                         let content = fs.readFileSync(path.join(remotePath,filename), 'utf-8')
                         fs.appendFile('/Users/**/desktop/Test.txt', content)
                    }
                } else if(stats.isDirectory()){
                    return false
                }
            });
        });
    });
    5. 读取文件目录下的所有文件,匹配内容输出到新的文件
    var fs = require('fs');
    var readline = require('readline');
    var path = require('path');
    var os = require('os');
    
    //解析需要遍历的文件夹
    var filePath = path.resolve('/Users/**/desktop/title');
    //调用文件遍历方法
    fileDisplay(filePath);
    var fWriteName = './emojis2.csv';
    var matchArr = [];
    var index = 1;
    function fileDisplay(filePath){
        //根据文件路径读取文件,返回文件列表
        fs.readdir(filePath,function(err,files){
            if(err){
                console.warn(err)
            }else{
                //遍历读取到的文件列表
                files.forEach(function(filename){
                    //获取当前文件的绝对路径
                    var filedir = path.join(filePath,filename);
                    //根据文件路径获取文件信息,返回一个fs.Stats对象
                    fs.stat(filedir,function(eror,stats){
                        if(eror){
                            console.warn('获取文件stats失败');
                        }else{
                            var isFile = stats.isFile();//是文件
                            var isDir = stats.isDirectory();//是文件夹
                            if(isFile){
                                if(/title_201711/.test(filename)) {
                                    var fRead = fs.createReadStream(filedir);
                                    var fWrite = fs.createWriteStream(fWriteName);
                                    var enableWriteIndex = true;
                                    var objReadline = readline.createInterface({      // 按行读取
                                        input: fRead
                                    });
                                    objReadline.on('line', (line)=>{
                                        if (enableWriteIndex) {
                                            if(/[]{}<>[@【】「」#*^]/.test(line)){
                                                matchArr.push(index)
                                                if (matchArr.length <= 10000) {
                                                    var tmp = line;
                                                    console.log(line)
                                                    fWrite.write(tmp + os.EOL);
                                                }
                                            }
                                            index ++;
                                        }
                                    });
                                    objReadline.on('close', ()=>{
                                        console.log(matchArr.length)
                                       // console.log(index)
                                    });
                                }
                            }
                            if(isDir){
                                fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
                            }
                        }
                    })
                });
            }
        });

    当然,这些功能都能通过shell命令行实现。只是有时utf8编码问题导致正则在命令行匹配不到准确数据,所以在 node 中实现。
  • 相关阅读:
    Xhprof分析php性能
    Xhprof graphviz Warning: proc_open() [function.proc-open]: CreateProcess failed, error code 解决方法
    使用xhprof会在nginx下报502 Bad Gateway错误
    springbooot2 thymeleaf 配置以及加载资源文件。Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
    springboot用户登陆密码两次md5加密
    SpringBoot2.0 redis生成组建和读写配置文件
    spring2.0:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either th
    SpringBoot 2.0 报错: Failed to configure a DataSource: 'url' attribute is not specified and no embe
    秋季学期总结
    寒假作业3:抓老鼠啊~亏了还是赚了?
  • 原文地址:https://www.cnblogs.com/cina33blogs/p/7851917.html
Copyright © 2011-2022 走看看