将标题添加到CSV并在Node.js中返回带有匹配字符串的行

时间:2018-06-28 13:37:21

标签: json node.js csv highland.js

我正在尝试在匹配的字符串上返回行值。

我从没有头信息的csv开始。将csv加载到内存后,我想我需要首先添加标头,然后将数据转换为json,然后遍历数据以在数组中找到正确的对象。

我已经使用高地来创建读取流并输出到对象。但是,没有解析出换行符\r\r\n并将它们插入值字符串中。

这种方法似乎也不能解析整个文件,而是输出3行。

highland(fs.createReadStream('example.csv', 'utf8'))
  .map(line => line.split(','))
  .map(parts => ({
    a: parts[0],
    b: parts[1],
    c: parts[2]
}))
.each(x => console.log(x))

最好将CSV结构化为JSON,然后使用.filter()方法来匹配记录。

实际输出1000多个行文件

{ a: '', b: 'CD53110' }
{ a: '\nRD40115', b: 'CD40315' }
{ a: '', b: '63\r\nRE15468' }
{ a: '96798', b: '5\r\nRR60899' }

示例输入片段

,CD510,13
,T9069,65
RCM22,TC633,101
RC023,87693,16
M2024,T7636,109

注意:前几行仅包含'b'和'c'列。

1 个答案:

答案 0 :(得分:0)

您可以将标头写为字符串,将csv设置为内存,然后将两者串联。

然后使用csvtojson模块,您可以将csv映射到json并使用本机过滤器功能返回匹配的行。

const fs = require('fs')
const csv = require('csvtojson')

let headers = 'a,b,c\n'
let file = fs.readFileSync(__dirname + 'example.csv', 'utf8')
let strToMatch = 'def123'

let c = headers + file

csv().fromString(c)
  .then((json) => {
    let arr = json.filter(el => el.a == strToMatch)
    res.json({
      a: arr[0]['a'],
      b: arr[0]['b'],
      c: arr[0]['c']
    })
})