该库最开始建立目标为读取Csv文件,并且解析成需要的格式(字符串、按行解析成字段)。
随着后其加入的功能越来越多,此库目标变为:成为javaScript环境统一处理 按序读取异步数据 的基类
以及一个 原始文件解析器 。
在读取大文件时,不可能一次全部读入内存,需要分片。
但是各个分片完成的时间并不是按顺序的。假设我们同时发出两个异步读取,分别命名为r1,r2。
const bigFileInst = new Blob()
const r1 = new FileReader()
const r2 = new FileReader()
r1.onloadend = () => console.log(r1.result)
r2.onloadend = () => console.log(r2.result)
r1.readAsArrayBuffer(bigFileInst.slice(0, 100))
r2.readAsArrayBuffer(bigFileInst.slice(100, 200))由于javaScript异步机制,此时,并不能保证r1先于r2完成。如果不能按顺序取得源数据,
在解析的时候将会出现错误。
- 创建一个
BaseReader类来管理读取过程中得到的数据。BaseReader是一个可观察的类(Observable), 所有的Reader都继承该类。 - 当
Reader开始读取内容时,将数据存入BaseReader,将会得到一个记录集合,记为S(n)。 - 当
Reader读取完成一个分片时,通知BaseReader,BaseReader将会从头开始遍历S(n)。 检测每一个记录的状态,如果第一个记录完成读取,则向观察者传递该记录。 - 重复
2~3过程
在javaScript环境(nodejs,browser),甚至是所有的语言环境中,文件只是一堆编码数据,
大多为unsigned int类型。
在程序中表现为一个Buffer。
要将这些文件解析成正确的内容,首先要确定文件的编码方式,之后按照编码方式解析为正确的编码数字,
对应码表,查出实际内容。
const utf8 ='UTF8ParserCreatedByYou'
const buf = [230, 156, 128, 230, 152, 175, 228, 186, 186, 233, 151, 180, 231, 149, 153, 228, 184, 141, 228, 189, 143]
const str = utf8.parse(buf).toString() // 最是人间留不住所以,要将一个文件内容正确的展示给用户看,仅有Reader是不够的,还需要有parser。
准确的说还需要有一堆parser。
该库将parser分为两类:
- 原始编码解析器:
utf8,ucs2,gbk,utf16... - 特定文件解析器:
csv,excel...
热烈欢迎大家补充parser,目前只有utf8与ucs2,太少了。