Вы можете использовать библиотеку csvtojson для быстрого преобразования CSV-файла или строки в массив объектов в JavaScript:

index.js

import csvToJson from 'csvtojson';

const csvFilePath = 'data.csv';

const array = await csvToJson().fromFile(csvFilePath);
console.log(array);

Для такого файла data.csv:

data.csv

color,maxSpeed,age
"red",120,2
"blue",100,3
"green",130,2

Это будет результирующий массив:

Output

[
  { color: 'red', maxSpeed: '120', age: '2' },
  { color: 'blue', maxSpeed: '100', age: '3' },
  { color: 'green', maxSpeed: '130', age: '2' }
]

Установить csvtojson

Прежде чем использовать csvtojson, вам необходимо установить его в свой проект. Вы можете сделать это с помощью NPM или Yarn CLI.

npm i csvtojson

# Yarn
yarn add csvtojson

После установки вы сможете импортировать его в модуль JavaScript, например:

import csvToJson from 'csvtojson';

// CommonJS
const csvToJson = require('csvtojson');

Преобразование файла CSV в массив с помощью fromFile()

Мы вызываем функцию экспорта по умолчанию модуля csvtojson, чтобы создать объект, который преобразует CSV в массив. У этого объекта есть множество методов, каждый из которых так или иначе связан с преобразованием CSV в объект JavaScript, и fromFile() — один из них.

Он принимает имя CSV-файла для преобразования и возвращает Promise, поскольку преобразование является асинхронным процессом. Promise будет разрешено с результирующей строкой JSON.

Преобразование строки CSV в массив с помощью fromString()

Чтобы преобразовать строку данных CSV напрямую, а не из файла, вы можете использовать также асинхронный метод fromString() объекта преобразователя:

index.js

import csvToJson from 'csvtojson';

const csv = `"First Name","Last Name","Age"
"Russell","Castillo",23
"Christy","Harper",35
"Eleanor","Mark",26`;
const array = await csvToJson().fromString(csv);
console.log(array);

Output

[
  { 'First Name': 'Russell', 'Last Name': 'Castillo', Age: '23' },
  { 'First Name': 'Christy', 'Last Name': 'Harper', Age: '35' },
  { 'First Name': 'Eleanor', 'Last Name': 'Mark', Age: '26' }
]

Настроить преобразование CSV в массив

Функция экспорта по умолчанию csvtojson принимает объект, используемый для указания параметров для настройки процесса преобразования.

Одним из таких параметров является header, массив, используемый для указания заголовков в данных CSV.

index.js

import csvToJson from 'csvtojson';

const csv = `"First Name","Last Name","Age"
"Russell","Castillo",23
"Christy","Harper",35
"Eleanor","Mark",26`;
const array = await csvToJson({
  headers: ['firstName', 'lastName', 'age'],
}).fromString(csv);
console.log(array);

Output

[
  { firstName: 'Russell', lastName: 'Castillo', age: '23' },
  { firstName: 'Christy', lastName: 'Harper', age: '35' },
  { firstName: 'Eleanor', lastName: 'Mark', age: '26' }
]

Другой — delimeter, используемый для обозначения символа, разделяющего столбцы:

import csvToJson from 'csvtojson';

const csv = `"First Name"|"Last Name"|"Age"
"Russell"|"Castillo"|23
"Christy"|"Harper"|35
"Eleanor"|"Mark"|26`;
const array = await csvToJson({
  headers: ['firstName', 'lastName', 'age'],
  delimiter: '|',
}).fromString(csv);

Output

[
  { firstName: 'Russell', lastName: 'Castillo', age: '23' },
  { firstName: 'Christy', lastName: 'Harper', age: '35' },
  { firstName: 'Eleanor', lastName: 'Mark', age: '26' }
]

У нас также есть ignoreColumns, параметр, который указывает конвертеру игнорировать определенные столбцы, используя регулярное выражение.

import csvToJson from 'csvtojson';

const csv = `"First Name"|"Last Name"|"Age"
"Russell"|"Castillo"|23
"Christy"|"Harper"|35
"Eleanor"|"Mark"|26`;
const array = await csvToJson({
  headers: ['firstName', 'lastName', 'age'],
  delimiter: '|',
  ignoreColumns: /lastName/,
}).fromString(csv);
console.log(array);

Output

[
  { firstName: 'Russell', age: '23' },
  { firstName: 'Christy', age: '35' },
  { firstName: 'Eleanor', age: '26' }
]

Преобразование CSV в массив строк

Установив для параметра output значение 'csv', мы можем создать список массивов, где каждый массив представляет строку, содержащую значения всех столбцов этой строки.

Например:

index.js

import csvToJson from 'csvtojson';

const csv = `color,maxSpeed,age
"red",120,2
"blue",100,3
"green",130,2`;
const array = await csvToJson({
  output: 'csv',
}).fromString(csv);
console.log(array);

Output

[
  [ 'red', '120', '2' ],
  [ 'blue', '100', '3' ],
  [ 'green', '130', '2' ]
]

Собственное преобразование CSV в массив

Также возможно преобразовать CSV в массив JavaScript без использования каких-либо сторонних библиотек.

index.js

function csvToArray(csv) {
  // \n or \r\n depending on the EOL sequence
  const lines = csv.split('\n');
  const delimeter = ',';
  const result = [];
  const headers = lines[0].split(delimeter);
  for (const line of lines) {
    const obj = {};
    const row = line.split(delimeter);
    for (let i = 0; i < headers.length; i++) {
      const header = headers[i];
      obj[header] = row[i];
    }
    result.push(obj);
  }
  // Prettify output
  return JSON.stringify(result, null, 2);
}
const csv = `color,maxSpeed,age
"red",120,2
"blue",100,3
"green",130,2`;
const array = csvToArray(csv);
console.log(array);

Output

[
  {
    "color": "color",
    "maxSpeed": "maxSpeed",
    "age": "age"
  },
  {
    "color": "\"red\"",
    "maxSpeed": "120",
    "age": "2"
  },
  {
    "color": "\"blue\"",
    "maxSpeed": "100",
    "age": "3"
  },
  {
    "color": "\"green\"",
    "maxSpeed": "130",
    "age": "2"
  }
]

Вы можете изменить приведенный выше код, чтобы разрешить различные и более сложные данные CSV.

Первоначально опубликовано на codingbeautydev.com

Все сумасшедшие вещи, которые делает JavaScript

Увлекательное руководство по тонким предостережениям и менее известным частям JavaScript.

Зарегистрируйтесь и немедленно получите бесплатную копию.