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

Javascript using File.Reader() to read line by line

本文关键字:读取 Javascript 逐行 File Reader 使用      更新时间:2023-09-26

这个问题很接近,但还不够接近。

我的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

有足够多的关于如何读取CSV文件的文章,我正在使用

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

但是,我看不出如何在Javascript中一次读取一行,或者即使这是可能的。

我的CSV数据看起来像

Some detail: date, ,
More detail: time, ,
val1, val2
val11, val12
#val11, val12
val21, val22

我需要去掉前2行,还需要考虑如何处理以#开头的行(因此我需要一次通读一行)

所以,除了把很多东西加载到内存中,我有什么选择一次读一行吗?

到目前为止,还没有readLine()方法可以执行此操作。然而,一些想法需要探索:

  • 从blob读取确实会激发progress事件。虽然规范不需要它,但引擎可能会像XMLHttpRequest一样过早地填充.result属性
  • Streams API为文件读取器起草流式.read(size)方法。不过,我认为它还没有在任何地方实现
  • Blob确实有一个slice方法,该方法返回一个包含部分原始数据的新Blob。规范和操作的同步性质表明,这是通过引用而不是复制来完成的,并且应该具有很高的性能。这将允许您逐块读取巨大的文件

诚然,这些方法中没有一种会在行尾自动停止。您需要手动缓冲块,将它们分解成行,并在它们完成后将它们移出。此外,这些操作是针对字节的,而不是针对字符的,因此可能需要处理多字节字符的编码问题。

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