今天,我们发布了Node.js CSV解析器项目的新主版本。 版本4是对项目的完整重写,重点是性能。 它还具有新功能,并对选项属性和导出的信息进行了一些清理。 官方网站已更新,更改日志包含此主要版本的更改列表。
一项艰巨的任务
Node.js CSV项目于2010年9月25日启动。在我们不断发展的技术世界中,这已经很老了。 从那时起,它就经受住了Node.js的多次发展,例如重新设计了Stream API。 多年来,该项目通过错误修复,文档和支持得以维护。 在社区的帮助下,提供了增量功能以适合每个用例。 测试套件的质量使我们有信心回到项目并深入研究代码。 但是,我从来没有勇气去发起一项任务:从头开始重写解析器,以利用Buffer API及其性能承诺。 假期的几天使我有机会从事这项工作。
- 我的无服务器之旅
- 奖金剧集:如何投入并成为成功的现场直播
- Smashcut 365:每天拍摄一部影片-第20周
- 混音器March Madness Streamer聚焦:InsertCoinTheater
- 2018年度最佳:成就我这一年的电视
重写从一个空白的新项目开始。 尽管可能仍有改进和进一步优化的余地,但我还是运行一些基准测试来衡量多个实施对性能的影响。 这就是我想出的Resizable Buffer类的方法,该类重复使用针对输入数据集调整的相同内部缓冲区,而不是为每个字段实例化新缓冲区。 准备就绪后,下一步就是编写解析器。 该过程分为多个迭代,精确地是13个:
- 基本缓冲区循环
- 添加__needMoreData
- 添加__autoDiscoverRowDelimiter
- 开始处理quote,scape,delimiter和record_delimiter
- 选项quote,escape,delimiter和record_delimiter工作
- 选项评论
- 选项Relax_column_count和skip_empty_lines以及信息计数,empty_line_count和skipped_line_count
- 选项skip_lines_with_empty_values,skip_lines_with_error,从到
- 选项栏
- 选件修剪
- 选择放松
- 选项objname,raw,cast和cast_date
- 重写信息计数器
该实现不再使用CoffeeScript,而是直接用JavaScript 6编写。请不要误解,我仍然是CoffeeScript的忠实拥护者,我们仍在测试中使用它的表现力。 但是,我需要对代码进行精细的控制,使用JavaScript作为主要语言有望希望鼓励更多的贡献。
重大变化
总体而言,没有重大的重大变化。 模块相同,并且使用它的API保持不变。 但是,要考虑一些小的重大更改,例如将rowDelimiter选项重命名为record_delimiter,删除一些先前不赞成使用的选项,并将可用的计数器重新组合到新的info属性中:
- 选项rowDelimiter现在为record_delimiter
- 计数现在是info.records
- 删除记录事件
- 将错误消息标准化为{错误类型}:{错误描述}
- 现在将状态值隔离到info对象中
- 计数现在是info.records
- 现在的行是info.lines
- empty_line_count现在为info.empty_lines
- skipped_line_count现在为info.invalid_field_length
- 转换功能中的context.count现在是context.records
- 删除对不推荐使用的选项auto_parse和auto_parse_date的支持
- 在原始选项中,将行属性重命名为记录
- 现在max_limit_on_data_read选项现在为max_record_size
- 现在,max_record_size的默认值为0(无限制)
- 释放记录事件,使用可读事件和this.read()代替
影响最大的重大更改可能是因为rowDelimiter选项的流行用法而将其重命名为record_delimiter。 此外,现在默认情况下,max_record_size不受限制,并且如果使用,则必须明确定义。
新的功能
此新版本还具有新功能。 新的信息对象是一个不错的插件。 它重新组合了一些计数器属性,这些属性可直接从解析器实例获取。 这些属性已重命名为更具表现力。 信息对象可以直接从解析器实例中以info的形式获得。 对于回调用户,它们将作为其回调函数的第三个参数导出。 通过激活值为true的info选项,它们也可用于每个记录。
有3个新选项,分别是info,from_line和to_line:
- info:生成两个属性info并记录,其中info是创建记录时info对象的快照,而record是已解析的数组或对象; 请注意,它可以与raw选项一起使用。
- from_line:从请求的行号开始处理记录。
- to_line:在请求的行号之后停止处理记录。
info选项对于调试或向最终用户提供有关其错误的反馈非常有用。
from_line和to_line选项分别过滤数据集的第一行和最后一行。 说到行,解析器的早期版本在对行和记录定界符混合的行进行计数时肯定会感到困惑。 它对大多数用户有效的原因很简单,因为他们通常是相同的。 此新版本将修复该问题。
这是从变更日志中提取的新功能列表:
- 新的选项信息,from_line和to_line
- trim:定义时尊重ltrim和rtrim
- 分隔符:可能是一个缓冲区
- 定界符:处理多个字节/字符
- 回调:导出信息对象作为第三个参数
- 演员:捕获用户功能中的错误
- TypeScript:使用必需的属性将信息标记为只读
- comment_lines:计算没有记录的注释行数
接下来会发生什么
源代码由扩展的测试套件提供支持。 没有测试被删除,新的测试似乎增强了解析器的保证。 但是,测试可能无法涵盖某些行为,在接下来的几周内,我们将依靠您的反馈来解决所有即将出现的问题。
虽然在解析器环境中不是ES6 Promise的忠实拥护者,但已经多次提出了支持请求,并且很快就会提出。 它还将在其他CSV包中实现。
另一个潜在的改进是使用其他信息(例如与每种错误类型相关联的唯一代码)扩展错误对象。 在进行改进的同时,还有更好地规范消息的空间。
我还计划支持Flow静态类型检查器。 我以前从未用过。 似乎适合该包装,它将为我提供尝试的机会。
最后,我正在考虑编写一个命令行工具,该工具将公开所有可用选项并提供多种输出格式(JSON,JSON行,YAML等)。
最初发表于 Adaltas 。