
来源:公众号《前端全栈开发者》(ID:by-zhangbing-dev)
将CSV转换为JSON是一项需要做很多工作的任务,在本文中,我将研究如何使用 csvtojson
模块将CSV转换为JSON。
CSV简介
CSV即Comma Separate Values,其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用,经常用来作为不同程序之间的数据交互的格式,最广泛的应用是在程序之间转移表格数据。
来自搜狗百科: https:// baike.sogou.com/v249053 .htm?fromTitle=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_name
john,smith
jane,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,这样我们就可以用自己喜欢的方式处理它们。
解析是异步完成的,因此性能不会成为问题。