【问题标题】:change a file using node.js使用 node.js 更改文件
【发布时间】:2014-02-10 17:53:25
【问题描述】:

我有一个如下所示的文本文件:

./4F6cFLnAAFc.png
./4Flj9plmKGQ.png
./4fQeHtSdw80.png
./4I9iibPLdBw.png
./4J-dRA3MGc8.png
./4mdEsouIXGM.png
./4-_-wQc3EGE.png
./595Tiga1gIg.png
./60u_ctp6UIw.png
./64bH_27Ehoc.png
./64_ZfIemRGM.png
./66pQLO--Ghk.png
./69rDtSpshAw.png
./69-YUSazuic.png

我想使用 node.js 将每行开头的 . 替换为“myString”。所以每个最终都会看起来像:myString/4F6cFLnAAFc.png

我正在尝试使用正则表达式,但我怀疑它可以使用读写流来完成。

var fs = require('fs');

fs.readFile('filelist.txt', 'utf-8', function(err, data){
    if (err) throw err;

    console.log(typeof(data)); // string

    data.replace(/\.\/+/, 'myString');

});

什么正则表达式可以工作,或者使用节点编辑这个文件的最佳方法是什么?

【问题讨论】:

    标签: javascript node.js filesystems fs


    【解决方案1】:

    这里有两个同步或异步选项,具体取决于您的需要。

    var fs = require('fs');
    
    function readWriteAsync() {
      fs.readFile('filelist.txt', 'utf-8', function(err, data){
        if (err) throw err;
    
        var newValue = data.replace(/^\./gim, 'myString');
    
        fs.writeFile('filelistAsync.txt', newValue, 'utf-8', function (err) {
          if (err) throw err;
          console.log('filelistAsync complete');
        });
      });
    }
    
    function readWriteSync() {
      var data = fs.readFileSync('filelist.txt', 'utf-8');
    
      var newValue = data.replace(/^\./gim, 'myString');
    
      fs.writeFileSync('filelistSync.txt', newValue, 'utf-8');
    
      console.log('readFileSync complete');
    }
    
    readWriteAsync();
    readWriteSync();
    

    【讨论】:

    • 先生,它只替换第一个字符串,我想全部替换(replaceAll() 不起作用)...
    【解决方案2】:

    这个正则表达式应该可以工作:/^\.(.+)/gm

    它对以句点 (^\.) 开头的所有行执行全局多行匹配 (/gm),捕获句点 ((.+)) 之后的任何内容,并将整个字符串替换为“myString”与捕获的值连接($1)。

    var fs = require('fs'),
    fileList = '/filelist.txt';
    
    fs.readFile(fileList, function(err, data) {
        if(err) throw err;
        data = data.toString();
        data = data.replace(/^\.(.+)/gm, 'myString$1');
        fs.writeFile(fileList, data, function(err) {
            err || console.log('Data replaced \n', data);
        });
    });
    

    【讨论】:

      【解决方案3】:

      如果您想使用非常大的文件更新/编辑/更改行/文件,根据我的经验,最好的方法是:

      • 使用 Nodejs 中的 readline 模块,不会导致任何内存问题
      • 对于您读取的每一行,您可以使用fs.appendFileSync 将数据写入另一个文件中

      代码示例:

      const fs = require('fs');
      const readline = require('readline');
      
      const rd = readline.createInterface({
          input: fs.createReadStream('./old-data.csv'),
          output: process.stdout,
          console: false
      });
      
      const regex_pattern = /(.*),.*,.*,.*,(.*),.*,.*,.*,.*/
      rd.on('line', function(line) {
          // if your line matches the pattern, you need to process it
          if(regex_pattern .test(line)) {
            // do your job here to get your string that you want
            // my_string_1 = ''
            // my_string_2 = ''
            fs.appendFileSync('new-data.csv', `\n${my_string_1 }`, 'utf-8')
            fs.appendFileSync('new-data.csv', `\n${my_string_2 }`, 'utf-8')
          } else { // otherwise, append to a new file
            fs.appendFileSync('new-data.csv', `\n${line}`, 'utf-8')
          }
      });
      

      在我的例子中,当编辑一个超过 100 万行的文件时,它只消耗大约 10-12% 的 cpu,而且内存很少

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        相关资源
        最近更新 更多