纯JavaScript读取文本文件指定行的函数实现需求
纯JavaScript读取文本文件指定行的实现
下面分浏览器端和Node.js端两种场景给出实现方案,都是纯JS代码,新手可以直接参考使用:
一、浏览器端(读取用户上传的本地文件)
浏览器无法直接访问本地文件系统,需要通过用户上传文件的方式获取文件对象,再借助FileReader读取内容并提取指定行:
function getSpecifiedLineFromFile(file, targetLineNumber) { // 行号从1开始计数,传入0或负数直接抛出错误 if (targetLineNumber < 1) return Promise.reject(new Error('行号必须大于0')); return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function(e) { // 兼容不同系统的换行格式(\n、\r\n),拆分文件内容为行数组 const lines = e.target.result.split(/\r?\n/); // 数组索引从0开始,目标行对应索引为行号减1 const targetLine = lines[targetLineNumber - 1]; if (targetLine === undefined) { reject(new Error('文件没有这么多行')); } else { resolve(targetLine); } }; reader.onerror = function() { reject(new Error('读取文件失败')); }; // 以文本格式读取文件 reader.readAsText(file); }); } // 使用示例:假设页面有id为fileInput的文件选择框 document.getElementById('fileInput').addEventListener('change', function(e) { const file = e.target.files[0]; if (!file) return; // 读取第3行内容 getSpecifiedLineFromFile(file, 3) .then(line => console.log('第3行内容:', line)) .catch(err => console.error(err.message)); });
二、Node.js端(读取本地/服务器文件系统的文件)
Node.js可直接操作文件系统,根据文件大小推荐两种实现方式:
场景1:小文件一次性读取
适合文件体积较小的情况,一次性读取后拆分提取目标行:
const fs = require('fs').promises; async function getSpecifiedLine(filePath, targetLineNumber) { if (targetLineNumber < 1) throw new Error('行号必须大于0'); try { const content = await fs.readFile(filePath, 'utf8'); const lines = content.split(/\r?\n/); const targetLine = lines[targetLineNumber - 1]; if (!targetLine) throw new Error('文件没有这么多行'); return targetLine; } catch (err) { throw new Error(`读取失败:${err.message}`); } } // 使用示例 getSpecifiedLine('./test.txt', 5) .then(line => console.log('第5行内容:', line)) .catch(err => console.error(err.message));
场景2:大文件逐行读取(内存友好)
针对大文件,逐行读取可以避免一次性加载整个文件占用过多内存:
const fs = require('fs'); const readline = require('readline'); function getSpecifiedLineBigFile(filePath, targetLineNumber) { if (targetLineNumber < 1) return Promise.reject(new Error('行号必须大于0')); return new Promise((resolve, reject) => { let currentLine = 0; const rl = readline.createInterface({ input: fs.createReadStream(filePath), crlfDelay: Infinity // 识别所有换行格式 }); rl.on('line', (line) => { currentLine++; if (currentLine === targetLineNumber) { resolve(line); rl.close(); // 找到目标行后立即关闭流,停止读取 } }); rl.on('close', () => { if (currentLine < targetLineNumber) { reject(new Error('文件没有这么多行')); } }); rl.on('error', (err) => { reject(new Error(`读取失败:${err.message}`)); }); }); } // 使用示例 getSpecifiedLineBigFile('./large-file.txt', 1000) .then(line => console.log('第1000行内容:', line)) .catch(err => console.error(err.message));
内容的提问来源于stack exchange,提问作者Krzysiek
相关产品推荐
相关产品推荐

