在客户端用 JavaScript 逐行读取文件

2024-02-15

您能帮我解决以下问题吗?

Goal

在客户端(通过 JS 和 HTML5 类在浏览器中)逐行读取文件,无需将整个文件加载到内存中。

Scenario

我正在开发应该在客户端解析文件的网页。目前,我正在阅读本文件中描述的文件article http://www.html5rocks.com/en/tutorials/file/dndfiles/.

HTML:

<input type="file" id="files" name="files[]" />

JavaScript:

$("#files").on('change', function(evt){
    // creating FileReader
    var reader = new FileReader();

    // assigning handler
    reader.onloadend = function(evt) {      
        lines = evt.target.result.split(/\r?\n/);

        lines.forEach(function (line) {
            parseLine(...);
        }); 
    };

    // getting File instance
    var file = evt.target.files[0];

    // start reading
    reader.readAsText(file);
}

问题是 FileReader 一次读取整个文件,这会导致大文件(大小 >= 300 MB)的选项卡崩溃。使用reader.onprogress并不能解决问题,因为它只是增加结果直到达到极限。

发明轮子

我在互联网上做了一些研究,但没有找到简单的方法来做到这一点(有很多文章描述了这个确切的功能,但在 Node.js 的服务器端)。

作为解决这个问题的唯一方法,我只看到以下内容:

  1. 按块分割文件(通过File.split(startByte, endByte) method)
  2. 查找该块中的最后一个换行符 ('/n')
  3. 读取除最后一个换行符之后的部分之外的块,并将其转换为字符串并按行分割
  4. 从步骤 2 中找到的最后一个换行符开始读取下一个块

但我会更好地使用已经存在的东西来避免熵增长。


最终我创建了新的逐行阅读器,它与以前的完全不同。

特点是:

  • 基于索引的文件访问(顺序和随机)
  • 针对重复随机读取进行了优化(为过去已经导航过的行保存了具有字节偏移量的里程碑),因此在读取所有文件一次后,访问第 43422145 行几乎与访问第 12 行一样快。
  • 在文件中搜索:找下一个 and find all.
  • 精确的索引、偏移量和匹配长度,以便您可以轻松突出显示它们

检查这个jsFiddle http://jsfiddle.net/3hmee6vb/1/举些例子。

Usage:

// Initialization
var file; // HTML5 File object
var navigator = new FileNavigator(file);

// Read some amount of lines (best performance for sequential file reading)
navigator.readSomeLines(startingFromIndex, function (err, index, lines, eof, progress) { ... });

// Read exact amount of lines
navigator.readLines(startingFromIndex, count, function (err, index, lines, eof, progress) { ... });

// Find first from index
navigator.find(pattern, startingFromIndex, function (err, index, match) { ... });

// Find all matching lines
navigator.findAll(new RegExp(pattern), indexToStartWith, limitOfMatches, function (err, index, limitHit, results) { ... });

性能与之前的解决方案相同。您可以在 jsFiddle 中调用“Read”来测量它。

GitHub: https://github.com/anpur/client-line-navigator/wiki https://github.com/anpur/client-line-navigator/wiki

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在客户端用 JavaScript 逐行读取文件 的相关文章

  • 将 MVC 操作结果发送到打印机

    我有一个带有操作的控制器 SomeController ActionToBePrinted ActionToBePrinted 返回一个 html 视图 当按下按钮时 从普通的 mvc razor 视图调用此操作 当按下按钮时 我将如何将视
  • 使用 Moment.js 从 ISO 字符串中提取 utcOffset

    使用 moment js 我尝试从 ISO 日期字符串中提取偏移量 以便稍后在格式化纪元时间戳时使用该偏移量 以确保时间戳的转换位于同一时区 即使字符串中的偏移量为 0400 结果始终为0 var currentTime 2015 03 1
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • 为什么 Bootstrap 需要 jQuery? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经多次用谷歌搜索这个问题 但从未找到满意的答案 大多数答案似乎只是说 是的 Bootstrap 插件确实需要 jQuery https st
  • 为 Promise 编写循环的正确方法。

    如何正确构造循环以确保满足以下条件承诺电话和被束缚的记录器 log res 通过迭代同步运行 蓝鸟 db getUser email then function res logger log res this is a promise 我尝
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • ES6 Promises/在满足多个 Promise 后调用函数(不能使用 Promises.all)[重复]

    这个问题在这里已经有答案了 我正在编写 Javascript 它需要这些事件按以下顺序发生 同时触发多个 API 调用 所有调用完成且响应返回后 执行一行代码 听起来很简单 但棘手的部分是我不能使用 Promises all 因为我仍然希望
  • Immutable.js 推入嵌套对象中的数组

    假设有一个对象 const object foo bar 1 2 3 我需要推动4 to object foo bar array 现在我正在这样做 const initialState Immutable fromJS object co
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • 添加元数据到快速路线

    有什么方法可以将元数据添加到 Express 的路线中吗 例如 app get some route function req res some meta data 我正在寻找一种针对我的节点应用程序的 AOP 方法 因此我想通过身份验证和
  • 为什么react中的组件需要大写? [复制]

    这个问题在这里已经有答案了 因此 当您声明一个组件以小写首字母进行反应时 它不会显示 也不会引发错误 当您将组件名称大写时 它确实有效 这样的实现是怎样的呢 为了避免与现有的 html 元素发生冲突 还是这是一个错误 var test Re
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 如何防止 CSS 或 jQuery 中单词和标点符号之间的换行

    我在一个段落中有一些文字 我的问题是 当标点符号位于单词末尾时 有时可以换行到下一行 像这样 This is the text This is a new line 我可以用 CSS 或 jQuery 解决这个问题吗 如果您不在单词和标点符
  • 恢复默认的CSS属性

    我正在编写一个可在多个网站上使用的组件 每个网站都有自己的样式表 并且以不同的方式显示某些内容 我的所有 html 都包含在一个带有 id 的 div 中 div div 然而 我的组件是在所有网站上看起来一致 这很好 因为我将样式应用于组
  • 检测浏览器是否支持 contentEditable?

    There s 这个问题 https stackoverflow com questions 3497942 browser detect contenteditable features 但发布的解决方案是浏览器嗅探 我试图避免这种情况
  • data:image/png;base64 是什么意思?

    我从一个在线网站上举了一个例子 CSS 包含一个指向 png 的 URL 和一些随机字母 在这两种情况下 任何人都可以告诉我如何制作这样的代码 或者更确切地说 这些代码是关于什么的 这是html
  • 在 Javascript 中使用 fetch API 接收和处理 JSON

    在我的项目中 当条件不足时 我的 Django 应用程序会发送带有消息的 JSON 响应 我使用这个 JsonResponse 指令 Code data is taken email email return JsonResponse da
  • 使 html svg 对象也成为可点击的链接(在 iPhone 上)

    这个问题与使 html svg 对象也成为可点击的链接 https stackoverflow com q 11374059 4825796 但给出的答案似乎不适用于 iPhone ios 9 3 safari 和 chrome 浏览器 我
  • 如何找出javascript中加载了哪些javascript?

    继另一个问题的评论之后 我问自己是否有办法获取页面上加载的所有 js 代码的列表 就像 Firebug 或 chrome Inspector 所做的那样 有没有一种纯javascript的方法 一种方法是抓取脚本标签 但这样你可能会错过动态
  • 带有 'as' 属性的通用 React TypeScript 组件(能够渲染任何有效的 dom 节点)

    我在下面的示例中按预期工作 我的问题是 无论如何我可以重写它 这样我就不必传递通用的T和as支柱 理想情况下我想通过asprop 并让组件的 prop 接口使用它 这在 TypeScript 中可能吗 export type Props l

随机推荐

  • 将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围

    我有一个 ASP NET MVC 应用程序 我正在其中编辑现有数据库以更新特定字段 DateTime 我的数据库有4个字段 其中两个是创建日期 and 修改日期 当我尝试更新该字段时 我想保留创建日期时间相同 没有理由更新它的创建日期 我使
  • 从 R 中的 ACF 中提取数值

    这就是我正在尝试做的 x lt c 1 2 3 3 2 3 4 5 6 my acf acf x plot F gt my acf Autocorrelations of series x by lag 0 1 2 3 4 5 6 7 8
  • Firefox 和 CSS3:使用溢出:隐藏和 box-shadow

    我不确定这个错误是否仅适用于 Firefox 还是也适用于基于 WebKit 的浏览器 但这真的非常非常烦人 我有一个 CMS 界面的模板 框架 在一些宽度为 100 的元素上使用 box shadow 由于这会导致元素右侧出现阴影 因此会
  • Javamail 1.5.1、Tomcat 7 和 java.lang.ClassNotFoundException:javax.mail.Authenticator

    我尝试将 Javamail 1 5 1 与 Tomcat 7 和 Eclipse Kepler 一起使用 当我尝试发送电子邮件时 Tomcat 崩溃并出现以下错误 从文档中 我了解到我需要的所有内容现在都在 javax mail jar 中
  • 您应该在哪里启用 SSL?

    我的最后几个项目涉及销售产品 服务并需要用户输入信用卡信息等的 结账 流程的网站 显然 我们获得 SSL 证书是为了保证其安全性 并让客户放心 然而 我对它的微妙之处有点一无所知 最重要的是网站的哪些部分应该 使用 证书 例如 我访问过一些
  • spring批处理异常无法构造java.util.Map$Entry

    从命令行执行 Spring Batch 作业时 我们面临以下异常 Spring 批处理版本 3 0 2 RELEASE 春季版本 4 0 0 RELEASE xStream 版本 1 4 7 数据库 mysql 我正在连接到新的数据库模式
  • Android 中没有显示 ActionMode Bar 的所有图标?

    我已经为我的操作模式栏创建了一个带有图标的菜单 但并非所有菜单都在操作模式栏中显示有图标 这是我的菜单 xml 文件 menu menu
  • Visual Studio 2017 / 2019 添加缺失的区域

    使用 VS2017 2019 创建 ASP NET MVC Core Web 应用程序时 发现上下文菜单中缺少 添加区域 选项 该区域并未从 VS 2017 19 中删除 但已移至脚手架中 您可以使用以下步骤访问该区域 1 右键单击您的项目
  • Keras 中的 RMSE/RMSLE 损失函数

    我尝试参加我的第一次 Kaggle 比赛RMSLE给出作为所需的损失函数 因为我没有找到如何实现这个loss function我试图满足于RMSE 我知道这是一部分Keras过去 有什么方法可以在最新版本中使用它 也许通过定制功能backe
  • 将毫秒转换为天:小时:分钟:秒:毫秒的 Bash 脚本

    我编写了以下 bash 脚本 将毫秒转换为天 小时 分钟 秒 毫秒 以使日志文件更具可读性 bin bash Constants CON DAYS 0000000115741 CON HOURS 000000277778 CON MINUT
  • 从模态/弹出窗口中解开segue,导致开始/结束外观过渡的呼叫不平衡

    我有以下设置 导航控制器 gt VC1 Push gt VC2 PopOver 或 Modal Segue gt VC3 VC3 正在展开回 VC1 当从 VC2 到 VC3 的 Segue 为 PopOver 和 Modal 时 展开会以
  • Google Visualization - 在事件表排序中,将特定行保留为第一个可见记录?

    当用户单击标题进行排序时 我希望标记为 总计 的行保持为可见的第一行 我可以捕获表排序事件 如下所示 google visualization events addListener table getChart sort function
  • 不可行的函数模板的类型推导

    In 他的回答 https stackoverflow com a 22259156 420683 to 这个问题 https stackoverflow com q 22258054 420683以及评论区 约翰内斯 绍布 https s
  • 使用 Blogger API v3 和 Python 插入博客文章草稿

    我正在尝试使用 Blogger Api v3 客户端库发布一篇文章 https developers google com blogger docs 3 0 libraries https developers google com blo
  • NSPredicate 和数组

    我有一个简短的问题 我有一个NSArray洋溢着Cars 继承自 NSObject Car有 property NSString engine 也被视为 synthesize 现在我想使用过滤数组NSPredicate predicate
  • Bootstrap 中的固定页脚

    我正在尝试引导程序 http getbootstrap com 我想知道 如果内容滚动 如何修复底部的页脚而不使其从页面上消失 要让页脚粘在视口底部 请给它一个固定位置 如下所示 footer position fixed height 1
  • Vue.js v-if 对变量变化没有反应

    我正在使用 vue js 并且在正确使用 v if 方面遇到了一些困难 我正在尝试在模板内渲染条件模板 在创建的方法中 变量isloaded设置为 true 这应该会导致模板重新呈现并让 正在加载数据 消息消失 然而 日志表明 2s 的延迟
  • 如何添加 .NET Framework 安装先决条件

    我在 Microsoft Visual Studio 中有一个 C Windows 窗体项目2017 我添加了 Visual Studio 安装程序安装向导项目来为我的应用程序创建安装程序 这是我第一次使用安装程序项目 安装程序正确地具有
  • 按复杂标准合并/连接 2 个 DataFrame

    我有 2 个大型数据集 每个数据集有 70K 到 110K 我想关联 比较两者 并根据某些条件 标准查找 set2 中的哪些项目可以在 set1 中找到 我当前的策略是按公共字段对两个列表进行排序 然后运行嵌套for循环 执行条件if测试
  • 在客户端用 JavaScript 逐行读取文件

    您能帮我解决以下问题吗 Goal 在客户端 通过 JS 和 HTML5 类在浏览器中 逐行读取文件 无需将整个文件加载到内存中 Scenario 我正在开发应该在客户端解析文件的网页 目前 我正在阅读本文件中描述的文件article htt