Добавить заголовки в CSV и вернуть строку с соответствующей строкой в ​​Node.js

Я пытаюсь вернуть значение строки в соответствующей строке.

Я начинаю с CSV, который не имеет подробности заголовка. После загрузки CSV в память, я думаю, что мне нужно сначала добавить заголовки, а затем преобразовать данные в JSON, а затем перебрать данные, чтобы найти правильный объект в массиве.

Я использовал highland для создания потока чтения и вывода на объекты. Однако символы разрыва строки \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 ответ

Решение

Вы можете записать заголовки в виде строки, установить 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']
    })
})
Другие вопросы по тегам