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

时间:2014-09-26 09:41:18

标签: javascript csv

This question is close 但不够接近。

我的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行,并考虑如何处理以#开头的行(因此我需要一次读取行)

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

1 个答案:

答案 0 :(得分:5)

截至目前,没有readLine()方法可以执行此操作。但是,有些想法值得探讨:

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

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

另请参阅:Reading line-by-line file in JavaScript on client side