Javascript 如何删除换行符并生成单行文本?
我有一个日志文件,其中事件在多行中。为了使事件成为单行,首先我必须将包含日期的行和不包含日期的行分开。现在我试图编写一个逻辑来检查一行,如果它没有日期,则将其与Javascript 如何删除换行符并生成单行文本?,javascript,node.js,Javascript,Node.js,我有一个日志文件,其中事件在多行中。为了使事件成为单行,首先我必须将包含日期的行和不包含日期的行分开。现在我试图编写一个逻辑来检查一行,如果它没有日期,则将其与prevLine合并 如何使用正则表达式或任何其他有助于实现此任务的模块将多行合并为一行 ctrl.js var regex = /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\w+\]/; var prevLine; var readStream = fs.createReadStream(dir + '/
prevLine
合并
如何使用正则表达式或任何其他有助于实现此任务的模块将多行合并为一行
ctrl.js
var regex = /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\w+\]/;
var prevLine;
var readStream = fs.createReadStream(dir + '/' + logFile,'utf8');
readStream.pipe(split()).on('data', function (line) {
if (regex.test(line)) {
console.log('Line with date:', line);
parseLog(line,prevLine);
} else {
console.log('Line without date:', line);
line = prevLine + line;
}
function parseLog(line, prev) {
if (line.indexOf('|') === -1) line = prev + line;
}
});
文件数据
[2017-03-23T18:13:16Z]|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event { newTopology:
[ '-0000001337',
'-0000001338',
'-0000001339',
'-0000001340',
'-0000001341',
'-0000001342' ],
oldTopology:
[ '-0000001337',
'-0000001338',
'-0000001339',
'-0000001340',
'-0000001341' ],
workerId: 6,
pid: 30488 }
[2017-03-23T18:13:16Z]|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event { newTopology:
[ '-0000001337',
'-0000001338',
'-0000001339',
'-0000001340',
'-0000001341',
'-0000001342' ],
oldTopology: [],
workerId: 4,
pid: 30481 }
您可以这样做:
const split = require('split');
const regex = /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\w+\]/;
let items = [];
let item = [];
fs.createReadtStream(path.join(dir, logFile), 'utf8')
.pipe(split()).on('data', (line) => {
if (regex.test(line)) {
item = [];
items.push(item);
}
item.push(line);
});
let lines = items.map(item => item.join(' '));
lines.forEach(line => console.log(line));
每次有新行时,都可以向数组中添加新行,但如果有一行带有日期,则可以将该数组放入另一个数组中,并为这些单行创建新数组。然后,您可以通过连接内部数组中的元素来组合它们,您将拥有一个大型的组合行数组—在该示例中称为
行的数组。string.replace('\n','')
?更好的方法是:行.replace(/\r?\n/,“”)
(如果断线实际上是CRLF)@MikeC。这显然不是重复。OP明确询问如何仅删除特定的新行,而不是删除所有新行。另外,您的建议string.replace('\n','')
肯定是错误的,因为在任何情况下,它只替换第一次出现的\n
字符。@FREE\u和\u OPEN\u SOURCE我给出了一个简单的示例来说明删除换行符的工作原理。这仍然是一个重复,因为他们只需要对需要从中删除新行的字符串子集应用相同的方法。是的,我不认为这是重复的,因为我只想在行没有语法问题的情况下删除换行符,因为我没有使用ES6。@hussain,如果你正在努力的话使用ES6语法,您可以始终粘贴代码,它将为您翻译代码。非常有用的服务。它打印空数组var lines=items.map(函数(item){return item.join(“”);});console.log('行',行)
如果返回前statementitem未在map
功能中打印,我会在中看到它的打印项