2017-03-31 65 views
1

我想在字符串中打印包含日期的行,我正在使用拆分模塊來實現該任務。下面的代碼總是在打印else語句。如何打印包含特定字符串的行?

ctrl.js

fs.readFile(dir + '/' + logFile, 'utf8', function(err, data) { 
     var lines = data.split('\n'); 
     var linesWithDate = lines.split('|')[0].replace(/[\[\]']+/g,''); 
     lines.forEach(function(line) { 
      if (linesWithDate) { 
       console.log('print lines with date',line); 
      } else { 
       console.log('print lines without date',line); 
      } 
     } 
    }); 

文件數據

[2017-03-23T18:13:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy 
[2017-03-23T19:20:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum 
+0

您是否試過正則表達式? 以下是正則表達式的JavaScript文檔鏈接。 https://developer.mozilla.org/ro/docs/Web/JavaScript/Guide/Regular_Expressions – PianoSong

+0

僅僅使用grep,在睡眠中至少可以做40年這個問題有一些問題。 – 2017-03-31 17:56:30

+0

@torazaburo我從來沒有使用grep任何參考或示例? – hussain

回答

1

如何打印包含特定字符串的行?

const split = require('split'); 
fs.createReadtStream(path.join(dir, logFile), 'utf8') 
    .pipe(split()).on('data', (line) => { 
    if (line.indexOf('string') > -1) { 
     console.log('Line with string:', line); 
    } else { 
     console.log('Line without string:', line); 
    } 
}); 

我要打印包含日期字符串中的線,我使用切分模塊來實現這一任務。下面的代碼總是打印else語句

我不認爲你正在使用split模塊。這個例子的作用:

const split = require('split'); 
const regex = require('regex-iso-date'); 
fs.createReadtStream(path.join(dir, logFile), 'utf8') 
    .pipe(split()).on('data', (line) => { 
    if (regex().test(line)) { 
     console.log('Line with date:', line); 
    } else { 
     console.log('Line without date:', line); 
    } 
}); 

注意,這並不一定是一個有效的日期,因爲它可能會像匹配日期2017-13-13 ... - 要測試的有效日期只看到這樣的回答:

或者,如果你想匹配您喜歡[2017-03-23T18:13:16Z]特定字符串,那麼你可以嘗試這樣的事:

const split = require('split'); 
const regex = /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\w+\]/; 
fs.createReadtStream(path.join(dir, logFile), 'utf8') 
    .pipe(split()).on('data', (line) => { 
    if (regex.test(line)) { 
     console.log('Line with date:', line); 
    } else { 
     console.log('Line without date:', line); 
    } 
}); 

請注意,如果您的文件中包含無效日期,它也會與無效日期匹配。

+0

我可以使用拆分包來實現這個任務讓我看看 – hussain

+0

我添加了第二個答案,我的代碼使用拆分和正則表達式模塊,它只打印'console.log('Line without date:',line)'它打印所有行 – hussain

+0

@ hussain正則表達式可能太嚴格。看第三個例子。我更新了我的答案。 – rsp

0

下面是一些只打印出按行有效解析日期的代碼。我使用readline模塊而不是readfile,但您應該能夠通過替換input: process.stdin: 'use strict'來輕鬆調整邏輯;

var sExample = '[2017-03-23T18:13:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum'; 

const readline = require('readline'); 
const rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}); 

rl.setPrompt('Enter example string to test > '); 
rl.prompt(); 

rl.on('line', (line) => { 
    var sCandidate = line.split('|')[0].replace(/[\[\]']+/g,''); 

    if (Date.parse(sCandidate)) {     //it is a valid date 
    console.log(sCandidate); 
    } 

    process.exit(0); 
}); 
相關問題