收起 展开全文来源:公众号《前端全栈开发者》(ID:by-zhangbing-dev)
将CSV转换为JSON是一项需要做很多工作的任务,在本文中,我将研究如何使用 csvtojson 模块将CSV转换为JSON。
CSV简介
CSV即Comma Separate Values,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用,经常用来作为不同程序之间的数据交互的格式,最广泛的应用是在程序之间转移表格数据。
安装
csvtojson 可作为NPM模块使用。我们可以运行以下命令进行安装:
npm i csvtojson
该软件包可与浏览器和Node.js一起使用。
基本使用
我们可以从文件中获取CSV并将其转换为JSON,也可以从字符串中获取CSV并执行相同的操作。
例如,我们可以从文件中获取CSV并将其转换为JSON,如下所示:
person.csv
first_name,last_name
john,smith
jane,smith
index.js
const csvFilePath = \'person.csv\'
const csv = require(\'csvtojson\');
(async () = {
const jsonObj = await csv().fromFile(csvFilePath)
console.log(jsonObj);
})();
在上面的代码中,我们调用了 csv 函数,该函数使用带有文件路径的 fromFile 方法返回一个对象。
然后,当我们像上面一样登录 jsonObj 时,我们得到:
[ { first_name: \'john\', last_name: \'smith\' },
{ first_name: \'jane\', last_name: \'smith\' } ]
我们还可以将CSV从字符串解析为JSON。为此,我们可以编写以下代码:
const csv = require(\'csvtojson\');
const csvStr = `first_name,last_namejohn,smithjane,smith`;
(async () = {
const jsonObj = await csv().fromString(csvStr)
console.log(jsonObj);
})();
在上面的代码中,我们有 csvStr,其中包含存储在字符串中的相同CSV内容。
然后我们调用 fromString 而不是 fromFile 来获取CSV内容,并使用解析后的数据解析返回 Promise。
因此,我们得到与第一个示例相同的结果。
异步处理来自CSV URL的每一行
我们可以使用 subscribe 方法逐行解析CSV字符串。例如,我们可以如下使用它:
const csv = require(\'csvtojson\');
const csvFilePath = \'person.csv\'
csv()
.fromFile(csvFilePath)
.subscribe(
(json) = console.log(json),
() = console.log(\'error\'),
() = console.log(\'success\')
);
在上面的代码中,我们调用了 fromFile 方法,但是我们在后面调用了 subscribe 方法,而不是从promise中获取解析后的值。
然后,我们将解析的值一次只获取一行,而不是将其全部打包在一个数组中。
转换为CSV行
我们还可以用 subscribe 方法和 \'line\' 输出选项一次一行地获得原始CSV行。
例如,我们可以调用以下代码:
const csv = require(\'csvtojson\');
const csvFilePath = \'person.csv\'
csv({ output: \"line\" })
.fromFile(csvFilePath)
.subscribe((csvLine) = console.log(csvLine))
然后我们得到:
john,smith
jane,smith
从控制台日志输出。
选项配置项
我们传递给 csv 函数的对象可以采用以下选项:output——要转换的格式。它可以是 \'json\',这是默认的,\'csv\',这是一个csv行,或者 \'line\',它将csv转换成一个csv行字符串。
delimiter——用于分隔列的分隔符。\'auto\' 应该是未知值。
quote——如果列中有定界符,则可以使用引号字符将列内容括起来,这样,\'hello,world\' 之类的文本就不会被视为包含在两列中。
trim——如果要去除空格则为 true,否则为 false。
checkType——打开和关闭是否检查字段类型。
ignoreEmpty——忽略CSV列中的空值。
noheader——如果我们解析的CSV中没有标题,则返回 true。
headers——一个用于指定CSV数据标题的数组。如果为 false,则此值将覆盖CSV标头行。
flatKeys——不将标题字段中的 .和 [] 解释为嵌套对象。默认为 false。
maxRowLength——CSV行可以包含的最大字符。
checkColumn——检查行的列号是否与标题相同。
eol——要检查的行尾字符。
escape——用引号引起来的转义字符。默认为双引号。
includeColumns——正则表达式,包含列的模式。
ignoreColumns——带有模式的正则表达式,可忽略的列。
colParser——一个JSON对象来重写如何解析列。例如 { foo : \'number\'} 将把 foo 字段解析为一个数字。
alwaysSplitAtEOL——布尔值,指示是否按行末尾分割每行。
nullObject——布尔值,指示我们是否保持 null。
downstreamFormat——选项设置下游所需的JSON数组格式。解析为CSV行可以为 \'line\',向下游编写完整的JSON数组可以为 \'array\'。
needEmitAll——如果调用 .then 或使用 await,则解析器将生成JSON结果。
结束
使用 csvtojson Node包,将CSV解析为JSON很容易。
它逐行返回一个Promise或发送解析过的CSV,这样我们就可以用自己喜欢的方式处理它们。
解析是异步完成的,因此性能不会成为问题。
本文链接: http://csvsouth.immuno-online.com/view-694752.html