Javascript使用File.Reader()逐行读取

MyD*_*ons 4 javascript csv

这个问题很接近但不够接近.

我的HTML5应用程序读取CSV文件(尽管它也适用于文本)并在屏幕上显示一些数据.

我遇到的问题是CSV文件可能很大(我设法让业务同意1GB的文件大小限制).好消息是,我只需要在任何时候显示CSV文件中的一些数据.

这个想法就像(psudeo代码)

var content;
var reader =  OpenReader(myCsvFile)
var line = 0;

while (reader.hasLinesRemaning)
    if (line % 10 == 1)
      content = currentLine;
Loop to next line
Run Code Online (Sandbox Code Playgroud)

有足够的文章介绍如何阅读CSV文件,我正在使用

function openCSVFile(csvFileName){
    var r = new FileReader();
    r.onload = function(e) {
        var contents = e.target.result;
        var s = "";
    };  
    r.readAsText(csvFileName);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法看到如何在Javascript中一次读取行或即使它是可能的.

我的CSV数据看起来像

Some detail: date, ,
More detail: time, ,
val1, val2
val11, val12
#val11, val12
val21, val22
Run Code Online (Sandbox Code Playgroud)

我需要删除前两行,并考虑如何处理以#开头的行(因此我需要一次读取行)

因此,除了将批次加载到内存中之外,我是否有任何选项可以一次读取行?

Ber*_*rgi 6

readLine()到目前为止,没有办法做到这一点.但是,有些想法值得探讨:

  • 从blob读取会触发progress事件.虽然规范不要求,但引擎可能过早地填充.result属性,类似于XMLHttpRequest.
  • 流API 起草.read(size)文件阅读器的方法.不过,我不认为它已经在任何地方实施过了.
  • Blob 确实有一个slice方法,它返回一个包含原始数据的一部分的新Blob.操作的规范和同步性质表明这是通过引用完成的,而不是复制,并且应该是非常高效的.这将允许您逐块读取大块文件.

不可否认,这些方法都不会自动停在线路终点.您需要手动缓冲块,将它们分成几行并在完成后将它们移出.此外,这些操作正在处理字节,而不是字符,因此可能存在需要处理的多字节字符的编码问题.

另请参阅:在客户端JavaScript中读取逐行文件