如何通过 javascript 或 jquery 读取巨大的文本文件?

Posted

技术标签:

【中文标题】如何通过 javascript 或 jquery 读取巨大的文本文件?【英文标题】:How to read a huge text file through javascript or jquery? 【发布时间】:2012-02-23 12:10:34 【问题描述】:

如何通过 javascript 或 jquery 逐行读取巨大的文本文件? 我无法全部读取并拆分为数组,因为它需要大量内存。我只想直播...

编辑 作为说明,我正在开发一个 google chrome 扩展程序,因此使用 fso ActiveX 的解决方案在此浏览器上不起作用。还有其他想法吗?

【问题讨论】:

你确定 jquery 是适合这项工作的工具吗? 这里提出了类似的问题。 ***.com/questions/585234/… 我正在为 chrome 编写扩展程序。我认为它应该以这种方式在客户端购买中工作,它不会强制服务器。我可以使用 php 的其他语言是什么? 文本文件将是存储在网络地址或客户端计算机中的文件...... 最好使用带有文件流的 java servlet.. 【参考方案1】:

html5 最终通过文件 API 规范提供了一种与本地文件交互的标准方式。作为其功能的示例,文件 API 可用于在将图像发送到服务器时创建图像的缩略图预览,或允许应用程序在用户离线时保存文件引用。此外,您可以使用客户端逻辑来验证上传的 mimetype 是否匹配其文件扩展名或限制上传的大小。

规范提供了几个用于从“本地”文件系统访问文件的接口: 1.File - 单个文件;提供只读信息,例如名称、文件大小、mimetype 和对文件句柄的引用。 2.FileList - 一个类似数组的 File 对象序列。 (思考或从桌面拖动文件目录)。 3.Blob - 允许将文件分割成字节范围。

当与上述数据结构结合使用时,FileReader 接口可用于通过熟悉的 JavaScript 事件处理异步读取文件。因此,可以监视读取的进度、捕获错误并确定加载何时完成。在许多方面,API 类似于 XMLHttpRequest 的事件模型。

注意:在编写本教程时,Chrome 6.0 和 Firefox 3.6 支持处理本地文件所需的 API。从 Firefox 3.6.3 开始,不支持 File.slice() 方法。

http://www.html5rocks.com/en/tutorials/file/dndfiles/

【讨论】:

对于 HTML5,问题是读取代码中指定的文件。 HTML5 允许通过 读取文件。但是我需要在代码中指定文件。【参考方案2】:

惰性文本视图小部件旨在在网页上显示文本。关键特性是它不会将整个文本加载到浏览器内存中,而是仅显示文件的片段(帧)。这允许显示大的、非常大的、巨大的文本。

他的小部件提供用于文本显示的用户界面并需要服务器端数据源。你必须自己实现服务器端组件,它的逻辑很简单。当小部件需要下一个文本块时,它会向服务器(使用 POST 方法)查询下一个块。

http://polyakoff.ucoz.net/

【讨论】:

【参考方案3】:
fs.read(fd, buffer, offset, length, position, [callback])

从 fd 指定的文件中读取数据。

buffer 是数据将被写入的缓冲区。

offset 是缓冲区内开始写入的偏移量。

length 是一个整数,指定要读取的字节数。

position 是一个整数,指定从文件中的何处开始读取。如果 position 为 null,则从当前文件位置读取数据。

http://nodejs.org/docs/v0.4.8/api/fs.html#file_System

【讨论】:

不幸的是,我读到 Google chrome 不支持 FSO activeX 还有其他想法吗?【参考方案4】:

TextStream and Scripting.FileSystemObject

; object = ObjectOpen("Scripting.FileSystemObject") ; WIL syntax
; ObjectClose(object)                               ; WIL syntax
;
; TextStream = object.CreateTextFile(filename[, overwrite[, unicode]])      ; Creates a file as a TextStream
; TextStream = object.OpenTextFile(filename[, iomode[, create[, format]]])  ; Opens a file as a TextStream
;
; TextStream.Close                       ; Close a text stream.
;
; TextStream.ReadAll                     ; Read the entire stream into a string.
; TextStream.ReadLine                    ; Read an entire line into a string.
; TextStream.Read (n)                    ; Read a specific number of characters into a string.
; 
; TextStream.Write (string)              ; Write a string to the stream.
; TextStream.WriteLine                   ; Write an end of line to the stream.
; TextStream.WriteLine (string)          ; Write a string and an end of line to the stream.
; TextStream.WriteBlankLines (n)         ; Write a number of blank lines to the stream.
; 
; TextStream.SkipLine                    ; Skip a line.
; TextStream.Skip (n)                    ; Skip a specific number of characters.
; 
; TextStream.Line                        ; Current line number.
; TextStream.Column                      ; Current column number.
; 
; TextStream.AtEndOfLine                 ; Boolean Value. Is the current position at the end of a line?
; TextStream.AtEndOfStream               ; Boolean Value. Is the current position at the end of the stream?
; -------------------------------------------------------------------------------------------------------------------------------

示例代码:

function ReadFiles()

  var fso, f1, ts, s;
  var ForReading = 1;
  fso = new ActiveXObject("Scripting.FileSystemObject");
  f1 = fso.CreateTextFile("c:\\testfile.txt", true);
  // Write a line.
  Response.Write("Writing file <br>");
  f1.WriteLine("Hello World");
  f1.WriteBlankLines(1);
  f1.Close();
  // Read the contents of the file.
  Response.Write("Reading file <br>");
  ts = fso.OpenTextFile("c:\\testfile.txt", ForReading);
  s = ts.ReadLine();
  Response.Write("File contents = '" + s + "'");
  ts.Close();

【讨论】:

不幸的是,我读到 Google chrome 不支持 FSO activeX 还有其他想法吗?

以上是关于如何通过 javascript 或 jquery 读取巨大的文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过javascript或jquery将输入字段聚焦在Android浏览器上

当用户单击图像时,如何使用 JavaScript 或 jQuery 读取图像的像素?

如何使用 JavaScript 或 Jquery 删除输入文本上的所有内联脚本或 html 注入

通过 javascript/jquery 关闭 select2 下拉菜单

防止用户使用 jquery 或 javascript 重新加载页面 [重复]

如何使用 jquery 或 javascript 在元素中模拟 Ctrl+A 的行为? [复制]