如何修改Node.js脚本输出:生成指定结果文件与统计文件
批量文件搜索结果输出优化方案
以下是修改后的Node.js脚本,保留原有的Promise.all并行处理效率,同时实现你需要的两个输出需求:
const fs = require('fs').promises; const readline = require('readline'); // 单个文件搜索函数:找到目标数字返回行号,未找到返回false async function searchFile(filePath, targetNum) { const rl = readline.createInterface({ input: fs.createReadStream(filePath), crlfDelay: Infinity }); let lineNum = 0; for await (const line of rl) { lineNum++; // 字符串匹配目标数字,若需严格数字比较可转Number后判断 if (line.includes(targetNum.toString())) { rl.close(); return lineNum; } } return false; } async function main() { // 解析命令行参数:node script.js <目标数字> <文件1> <文件2> ... <输出yes/non文件> <输出数量文件> const args = process.argv.slice(2); if (args.length < 4) { console.error('用法:node script.js <目标数字> <文件列表> <输出标记文件> <输出计数文件>'); process.exit(1); } const targetNum = parseInt(args[0]); const filePaths = args.slice(1, args.length - 2); const outputFlagsFile = args[args.length - 2]; const outputCountFile = args[args.length - 1]; // 并行处理所有文件搜索,保证效率 const searchResults = await Promise.all( filePaths.map(filePath => searchFile(filePath, targetNum)) ); // 生成yes/non字符串(严格按文件传入顺序) const flagsStr = searchResults.map(result => result ? 'yes' : 'non').join(' '); // 统计找到目标的文件数量 const matchCount = searchResults.filter(result => result).length; // 异步写入两个输出文件 await Promise.all([ fs.writeFile(outputFlagsFile, flagsStr), fs.writeFile(outputCountFile, matchCount.toString()) ]); console.log('处理完成!'); } main().catch(err => console.error('出错:', err));
关键细节说明
- 并行效率保留:继续用
Promise.all批量启动文件搜索任务,所有文件的IO操作并行执行,避免串行处理的效率损耗,和你原脚本的高效逻辑一致。 - 逐行读取优化:用
readline逐行读取文件,找到目标后立即终止当前文件的读取,无需加载整个文件到内存,适合处理大文件。 - 参数解析逻辑:和PHP的
$argv、Python的sys.argv逻辑类似,通过process.argv获取命令行传入的目标数字、文件列表和输出路径。 - 结果处理:
- 遍历搜索结果数组,按顺序将“找到/未找到”转换为
yes/non,用空格拼接成指定格式的字符串。 - 用
filter快速统计结果中为true(即找到目标)的文件数量。
- 遍历搜索结果数组,按顺序将“找到/未找到”转换为
- 异步写入:用
Promise.all同时处理两个文件的写入操作,确保所有IO任务完成后才提示处理结束。
使用示例
假设脚本名为search.js,目标数字是123,要搜索的文件是a.txt、b.txt、c.txt,输出标记文件为flags.txt,计数文件为count.txt,运行命令:
node search.js 123 a.txt b.txt c.txt flags.txt count.txt
执行后:
flags.txt内容为类似yes non yes的字符串count.txt内容为找到目标的文件数量(比如2)
内容的提问来源于stack exchange,提问作者user3152377
相关产品推荐
相关产品推荐

