Есть ли пакет npm, который преобразует неструктурированные данные в csv? - PullRequest
2 голосов
/ 28 апреля 2019

Попытка экспортировать некоторые данные в CSV в Javascript. Попытка найти модуль npm для этого ... однако - у меня могут быть разные заголовки данных в строке ...

например, мои данные могут быть такими:

[ { name: 'John', color: 'Blue', age: 25 }, { name: 'Ursula', color: 'Red', food: 'pasta'},...]

В идеале, CSV будет экспортировать в это:

name, color, age, food
John, Blue, 25,
Ursula, Red,,pasta

Я изучил fast-csv, и, похоже, он не развлекает динамические заголовки (как указано выше) ... (в приведенном выше примере fast-csv будет иметь статические заголовки, предоставленные только первой записью ( только name, color и age))

1 Ответ

1 голос
/ 28 апреля 2019

Вот некоторый код, который сгенерирует этот вывод на основе аналогичной структуры данных с разными именами ключей в объектах.

const data = [{ name: 'John', color: 'Blue', age: 25 }, { name: 'Ursula', color: 'Red', food: 'pasta'}, { size: 12, feet: 'small', name: 'Bob'}];

function getHeadings(data) {

  // `reduces` over the array combining all the
  // different object keys into one array
  // removing the duplicates by converting it to a
  // Set, and then converting it back to an array again
  return [...new Set(data.reduce((acc, c) => {
    const keys = Object.keys(c);
    return acc.concat(keys);
  }, []))];
}

const headings = getHeadings(data);

// Iterate over the data...
const out = data.reduce((acc, c) => {

  // ...grab the keys in each object
  const keys = Object.keys(c);

  // ...create a new array filled with commas
  const arr = Array(headings.length).fill(',');

  // For each key...
  keys.forEach(key => {

    // ...find its index in the headings array
    const index = headings.findIndex(el => el === key);

    // ...and replace the comma in the array with the key
    arr[index] = `${c[key]},`;
  });
 
  // Add the array to the output
  return acc.concat(arr.join(''));
}, []).join('\n');

console.log(`${headings}\n${out}`);
...