web-dev-qa-db-ja.com

Node.jsを使用してJSON配列をCSVに変換する方法は?

値の配列を持つjsonを変換したい。 response.json

{
"rows": [
[
  "New Visitor",
  "(not set)",
  "(not set)",      
  "0"
],
[
  "New Visitor",
  "(not set)",
  "(not set)",
  "mobile"      
],
[
  "New Visitor",
  "(not set)",
  "(not set)",
  "mobile"    
],
  [
    "New Visitor",
    "(not set)",
    "(not set)",
   "mobile",      
  ]
 ]
}

このデータを変換したいと思います。 name.csv

 "New Visitor","(not set)","(not set)","0"
 "New Visitor","(not set)","(not set)","mobile"        
 "New Visitor","(not set)","(not set)","mobile"    
 "New Visitor","(not set)","(not set)","mobile"

Node.jsを使用して提案してください。

13
arjun kori

このように自分で行います:

'use strict';

var fs = require('fs');

let myObj = {
  "rows": [
    [
      "New , Visitor",
      "(not set)",
      "(not set)",
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile",
    ]
  ]
}

// 1. One way - if you want the results to be in double quotes and you have comas inside

// choose another string to temporally replace commas if necessary
let stringToReplaceComas = '!!!!';

myObj.rows.map((singleRow) => {
  singleRow.map((value, index) => {
    singleRow[index] = value.replace(/,/g, stringToReplaceComas);
  })
})

let csv = `"${myObj.rows.join('"\n"').replace(/,/g, '","')}"`;
// // or like this
// let csv = `"${myObj.rows.join('"\n"').split(',').join('","')}"`;

csv = csv.replace(new RegExp(`${stringToReplaceComas}`, 'g'), ',');

// // 2. Another way - if you don't need the double quotes in the generated csv and you don't have comas in rows' values
// let csv = myObj.rows.join('\n')

fs.writeFile('name.csv', csv, 'utf8', function(err) {
  if (err) {
    console.log('Some error occured - file either not saved or corrupted file saved.');
  } else {
    console.log('It\'s saved!');
  }
});

ライブラリを使用する

例: https://github.com/mrodrig/json-2-csvhttps://github.com/wdavidw/node-csvhttps: //github.com/wdavidw/node-csv-stringify

json-2-csvを使用した例( https://github.com/mrodrig/json-2-csv

'use strict';

const converter = require('json-2-csv');

let myObj = {
  "rows": [
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "0"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile",
    }
  ]
}

let json2csvCallback = function (err, csv) {
    if (err) throw err;
    fs.writeFile('name.csv', output, 'utf8', function(err) {
      if (err) {
        console.log('Some error occured - file either not saved or corrupted file saved.');
      } else {
        console.log('It\'s saved!');
      }
    });
};

converter.json2csv(myObj.rows, json2csvCallback, {
  prependHeader: false      // removes the generated header of "value1,value2,value3,value4" (in case you don't want it)
});

csv-stringifyの使用例( https://github.com/wdavidw/node-csv-stringify

'use strict';

var stringify = require('csv-stringify');
var fs = require('fs');

let myObj = {
  "rows": [
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile",
    ]
  ]
}

stringify(myObj.rows, function(err, output) {
  fs.writeFile('name.csv', output, 'utf8', function(err) {
    if (err) {
      console.log('Some error occured - file either not saved or corrupted file saved.');
    } else {
      console.log('It\'s saved!');
    }
  });
});
18
Relu Mesaros

3つの簡単なステップ:読む。変換。書く。

ステップ1:読み取り

ファイルからJSONを読み取る必要がある場合(投稿にファイル名_response.json_が含まれていることで示されています)、 Node.js FileSystem API が必要です。

_const fs = require('fs');                          // Require Node.js FileSystem API.
const JSONFile = fs.readFileSync('response.json'); // Read the file synchronously.
_

注:必要に応じて、非同期で fs.readFile() を使用してファイルを読み取り、変換をコールバック関数で実行できます。

ステップ2:変換

ローカルファイルからJSONを読み取るか、サーバーからGETするかに関係なく、最初に _JSON.parse_ メソッドを使用して、JSONをプレーンな古いJavaScriptオブジェクトに解析する必要があります。

_const JSONasPOJO = JSON.parse(JSONFile); // Parse JSON into POJO.
_

次に、子配列と親配列に対して一連の結合を実行します。
参照[〜#〜]編集[〜#〜]以下

_/* THIS IS UNNECESSARY FOR "COMMA" SEPARATED VALUES
const CSVString = JSONasPOJO
    .rows                    // Get `rows`, which is an array.
    .map(                    // Map returns a new array.
        row => row.join(',') // Each child array becomes a comma-separated string.  
     )                    
    .join('\n');             // Parent array becomes a newline-separated string...
                             // ...of comma-separated strings.
                             // It is now a single CSV string!
*/
_

編集:

前のコードは確かに機能しますが、子配列で_.map_および_.join_を使用する必要はありません。 _.join_は文字列を返す必要があるため、JavaScriptはデフォルトで自動的に子配列をカンマ区切りの文字列に変換するため、 @ Reluが示す のように、親配列の単一の_.join_で十分です。子配列を含めることはできません。

子配列をコンマ以外のものと結合したい場合は、上記のパターンを使用できます。

それ以外の場合:

_var CSVString = JSONasPOJO.rows.join('\n'); // Array becomes a newline-separated...
                                            // ...string of comma-separated strings.
                                            // It is now a single CSV string!
_

ここでは、変換が実際に行われていることがわかります:

_const JSONasPOJO = {
  "rows": [
    [
      "New Visitor",
      "(not set)",
      "(not set)",      
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"      
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"    
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile" // NOTE: Here I removed a trailing comma,
               // ...which is invalid JSON!
    ]
  ]
}

const CSVString = JSONasPOJO.rows.join('\n');

console.log(CSVString);_

ステップ3:書き込み

FileSystem APIを再度使用して、ファイルに書き込み、エラーまたは成功メッセージをログに記録します。

_fs.writeFile('name.csv', CSVString, err => {
    if (err) return console.log(err);
    console.log('FILE SUCCESSFULLY WRITTEN!\n');
});
_

注:ここでは、コールバックを使用してエラーと成功のメッセージをログに記録する非同期パターンを示します。必要に応じて、 fs.writeFileSync()を使用してファイルを同期的に書き込むことができます。

すべてを一緒に入れて

Node.jsスクリプトにたくさんのconsole.log()メッセージを追加したいです。

_const fs = require('fs');

const inFilename  = 'response.json',
      outFilename = 'name.csv';

console.log('\nPreparing to read from ' + inFilename + ' ...');

const JSONContents = fs.readFileSync(inFilename);

console.log('READ:');
console.log(JSONContents);

console.log('\nPreparing to parse as JSON ...');

const JSONasPOJO = JSON.parse(JSONContents);

console.log('PARSED:');
console.log(JSONasPOJO);

console.log('\nPreparing to convert into CSV ...');

const CSVString = JSONasPOJO.rows.join('\n');

console.log('CONVERTED:');
console.log(CSVString);

console.log('\nPreparing to write to ' + outFilename + '...');

fs.writeFile(outFilename, CSVString, err => {
    if (err) return console.log(err);
    console.log('FILE SUCCESSFULLY WRITTEN!\n');
});
_
7
gfullam

Json配列からcsv文字列を作成する最も簡単な方法を共有したいと思います。

const data = [
  { a: 1, b: new Date(), c: 'a text' },
  {
    a: 1, b: new Date(), c: `string
  with
  return
  carrier
  and emoji ????
  `
  }
]

const header = Object.keys(data[0]).map(_ => JSON.stringify(_)).join(';') + '\n'
const outData = data.reduce((acc, row) => {
  return acc + Object.values(row).map(_ => JSON.stringify(_)).join(';') + '\n'
}, header)

console.log(outData)

この文字列を出力します:

"a";"b";"c"
1;"2020-03-25T08:49:04.280Z";"a text"
1;"2020-03-25T08:49:04.280Z";"string\n  with\n  return\n  carrier\n  and emoji ????\n  "
0
Manuel Spigolon