【发布时间】:2015-08-07 01:47:04
【问题描述】:
现在许多浏览器都支持使用 HTML5 的 FileReader 读取本地文件,这为网站打开了大门,这些网站超越了“数据库前端”进入脚本,可以对本地数据做一些有用的事情,而无需先将其发送到服务器.
除了在上传之前对图像和视频进行预处理之外,FileReader 的一个重要应用是将数据从某种磁盘表(CSV、TSV 等)加载到浏览器中进行操作 - 可能用于在 D3 中进行绘图或分析.js 或在 WebGL 中创建景观。
问题是,StackOverflow 和其他网站上的大多数示例都使用 FileReader 的 .readAsText() 属性,该属性在返回结果之前将整个文件读入 RAM。
javascript: how to parse a FileReader object line by line
要在不将数据加载到 RAM 的情况下读取文件,需要使用 .readAsArrayBuffer(),而这篇 SO 帖子是我能得到的最接近好的答案:
但是,它对那个特定问题有点太具体了,老实说,我可以尝试几天来使解决方案更通用,但由于我不了解块大小的重要性或为什么使用 Uint8Array。使用用户可定义的行分隔符(最好使用 .split(),因为它也接受正则表达式)逐行读取文件的更一般问题的解决方案,然后每行执行一些操作(例如将其打印到console.log) 将是理想的。
【问题讨论】:
-
“使用用户可定义的行分隔符(最好使用 .split(),因为它也接受正则表达式)来解决更普遍的问题,如果你可以使用拆分,您已经加载了整个文件...
-
如果您在阅读时将其拆分为块,则不会 :) 说,读取 1Mb,拆分,处理线,其余添加另一个 1Mb,冲洗重复 :)
-
您使用 Uint8Array(或 node.js 中的 Buffer)的原因是因为文件可能是二进制文件,而 javascript 字符串无法处理二进制数据(例如,字节 0x00 - 也称为 nul终止符(是的,那是带有一个“l”的 nul))
-
这里我给出两点。先说说Uint8Array的使用。请记住,文件是 bytes 的序列,而不是 characters,就像字符串一样。结果,文件是以字节块(使用 Uint8Array)而不是字符块读取的(这就是为什么答案说它“假设输入是 ASCII”)。要转换为字符,需要知道字符编码(现在可以假定为 UTF-8,除非元数据另有规定)和字符解码器,例如使用的 TextEncoder 类。
-
下一行分隔符。一般来说,行分隔符只有两种或三种可能的选择:LF、CR/LF 和 CR。其中,前两个是最常见的(Linux 中的第一个,Windows 中的第二个)。其他选择将是非常不寻常的。因此,最好创建一个行阅读器来处理最常见的行分隔符选择,从而无需手动指定行分隔符。
标签: javascript html filereader