Giter Site home page Giter Site logo

node-convert-csv-to-array's Introduction

convert-csv-to-array

npm Travis branch Codecov branch

Convert a csv formatted string to an array

Table of Contents

Why?

I needed a simple way to convert csv formatted string to an array to display it in a table component.

Installation

$ npm i convert-csv-to-array -S

or

$ yarn add convert-csv-to-array

Functions

Take a look into the usage section for a detailed example.

convertCSVToArray

Note: you can also use the default export.

This function converts a csv formatted string into an array of objects, or into an array of arrays.

Syntax

Returns a new array.

const array = convertCSVToArray(data, options);
Parameters
  • data: a csv formatted string
  • options: a object
    • holds three keys: header, type and separator
    • header: either true or false, default: true
    • type: either 'object'or 'array', default: 'object'
    • separator: the character which is the separator in your csv formatted string, default: ','

Usage

Some examples on how to use this library.

const { convertCSVToArray } = require('convert-csv-to-array');
const converter = require('convert-csv-to-array');

// would be a use input (upload) or read from a file
const data = 'number;first;last;handle\n1;Mark;Otto;@mdo\n2;Jacob;Thornton;@fat\n3;Larry;the Bird;@twitter\n';

/*
  const arrayofArrays = [
    ['number', 'first', 'last', 'handle'],
    [1, 'Mark', 'Otto', '@mdo'],
    [2, 'Jacob', 'Thornton', '@fat'],
    [3, 'Larry', 'the Bird', '@twitter'],
  ];
*/
const arrayofArrays = convertCSVToArray(data, {
  type: 'array',
  separator: ';', // use the separator you use in your csv (e.g. '\t', ',', ';' ...)
});

/*
  const arrayofObjects = [
    ['number', 'first', 'last', 'handle'],
    {
      number: 1,
      first: 'Mark',
      last: 'Otto',
      handle: '@mdo',
    },
    {
      number: 2,
      first: 'Jacob',
      last: 'Thornton',
      handle: '@fat',
    },
    {
      number: 3,
      first: 'Larry',
      last: 'the Bird',
      handle: '@twitter',
    },
  ];
*/
const arrayofObjects = convertCSVToArray(data, {
  separator: ';', // use the separator you use in your csv (e.g. '\t', ',', ';' ...)
});

/*
  const arrayofArraysWithoutHeader = [
    [1, 'Mark', 'Otto', '@mdo'],
    [2, 'Jacob', 'Thornton', '@fat'],
    [3, 'Larry', 'the Bird', '@twitter'],
  ];
*/
const arrayofArraysWithoutHeader = convertCSVToArray(data, {
  header: false,
  type: 'array',
  separator: ';', // use the separator you use in your csv (e.g. '\t', ',', ';' ...)
});

/*
  const arrayofObjectsWithoutHeader = [
    {
      number: 1,
      first: 'Mark',
      last: 'Otto',
      handle: '@mdo',
    },
    {
      number: 2,
      first: 'Jacob',
      last: 'Thornton',
      handle: '@fat',
    },
    {
      number: 3,
      first: 'Larry',
      last: 'the Bird',
      handle: '@twitter',
    },
  ];
*/
const arrayofObjectsWithoutHeader = convertCSVToArray(data, {
  header: false,
  separator: ';', // use the separator you use in your csv (e.g. '\t', ',', ';' ...)
});

License

MIT © Lukas Aichbauer

node-convert-csv-to-array's People

Contributors

aichbauer avatar yitomok avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

node-convert-csv-to-array's Issues

Could not find a declaration file for module 'convert-csv-to-array'.

After installing the library in my React/TypeScript project, I get this error:

Could not find a declaration file for module 'convert-csv-to-array'. 'path/to/project/node_modules/convert-csv-to-array/lib/index.js' implicitly has an 'any' type.
Try npm i --save-dev @types/convert-csv-to-array if it exists or add a new declaration (.d.ts) file containing declare module 'convert-csv-to-array';

But no @types/conver-csv-to-array in the Npm/Yarn registeries.
This is what I get when attempting to install the package with yarn add -D @types/convert-csv-to-array:
error An unexpected error occurred: "https://registry.yarnpkg.com/@types%2fconvert-csv-to-array: Not found".

Comma delimiter, in csv with prices wrapped with " - fails

Hello,
I discovered that few websites generating reports create a csv where line looks like this

var row = 'facemask,45776607,name of product 30ml,15054,Facemask,"12,99 usd","90,71 usd","29,99 usd",53,59\n'

The thing is - that those few 3rd party platforms that generate reports, do not provide option to change delimiter, and your library fails to process such files - so I wrote small code snippet to change delimiter

var originalDelimiter = ',';
var newDelimiter = ';';
const changeDelimiter = (row, originalDelimiter = ',', newDelimiter = ';') => {
  var regex = new RegExp('(?=")(.+?)"', 'g');
  var superRows = row.split(regex);
  var newRow = [];
  superRows.forEach((separateRow) => {
    // if first element contains " remove " and skip
    if (separateRow.length && separateRow[0] === '"') {
      newRow.push(separateRow.substring(1));
      // if the row contain only originalDelimiter, dont add it - its an element like '"11,59","12,16"'
    } else if (separateRow.length && separateRow === originalDelimiter) {
    } else {
      // regular line - remove last delimiter to not create empty objects out of it
      if (separateRow.length && separateRow[separateRow.length - 1] === originalDelimiter) {
        separateRow = separateRow.substring(0, separateRow.length - 1);
      }
      // regular line - remove first delimiter to not create empty objects out of it
      if (separateRow.length && separateRow[0] === originalDelimiter) {
        separateRow = separateRow.substring(1);
      }
      newRow.push(...separateRow.split(originalDelimiter))
    }
  })
  console.log()
  return newRow.join(newDelimiter);
}
console.log(changeDelimiter(row,originalDelimiter,newDelimiter));

it would be great to add it to the library as optional feature.
if you would agree, I could prepare a proper pull request, refactoring this a little :)
Best
/piku

Need to consider the quotation marks when parse csv

Hi, I am using convert-csv-to-array(1.0.3) to write scripts to process my data. It works perfect for many times but this time I found some wired output parsing my csv.

After some test, here are two use cases this package can not handle:

When the cell contains space

const { convertCSVToArray } = require('convert-csv-to-array')
const data = `"post_title","post_name","meta_value"
"a","x",1
" b ","y",2
"c","z",3`
const out = convertCSVToArray(data, {
  header: false,
  separator: ','
});

console.log('out', out)

Output:

[
  {
    '"post_title"': '"a"',
    '"post_name"': '"x"',
    '"meta_value"': '1\n" b "',
    undefined: 2
  }
]

When the cell contains separator

const { convertCSVToArray } = require('convert-csv-to-array')
const data = `"post_title","post_name","meta_value"
"a,b","x",1`
const out = convertCSVToArray(data, {
  header: false,
  separator: ','
});

console.log(out)

Output:

[]

So I started to read the source code. I see this pr #8 which explained why we cannot split line by \n. And I read the source code of node-csv and csv-parser. Seems it is much more complicated than I think to parse csv. Seems it is not easy to parse csv only using split because some cell may be surrounded by quotation marks and any content may appear between the quotation marks.

I hope this parsing issue can be fixed. This package is very helpful to me and I chose it instead of other csv processing packages because its API is very simple and it is perfect for most needs. One simple solution I can imagine is to call some other package to parse csv and keep the simple API to the users.

Fix: convert without header

Actually there are no test cases for a conversion without a header, and I think it is not working correctly right now.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.