Node.jsで扱うよく扱うデータ形式の基礎知識



##JSON
ご存知、[JSON(JavaScript Object Notation)](http://json.org/json-ja.html)形式。
[JSONオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON)は、標準ビルトインオブジェクトなので特別な準備なしで手軽に扱うことができる。

###サンプル
```javascript:JSONの例
{
  "browsers": {
    "firefox": {
      "name": "Firefox",
      "pref_url": "about:config",
      "releases": {
        "1": {
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
      }
    }
  }
}
```

###使用方法
モジュールのインストールなどは不要。

```javascript
// 文字列textをJSONとして解析し、JSオブジェクトに変換
const obj = JSON.pares(text)

// JSオブジェクトをJSON文字列に変換
const text = JSON.stringify(obj)
```


##JSON5
[JSON5](https://json5.org/)は、JSONのスーパーセット。JSONの制限の一部を緩和する。

JSON5の拡張
* 末尾にコンマがあってもエラーにならない
* 文字列を一重引用符で囲むことができる
* 複数行の文字列を扱える（改行文字をエスケープする）
* 単一行および複数行のコメントが使える
* 空白文字を使用できる
など

###サンプル

```javascript:JSON5の例
{
  // comments
  unquoted: 'and you can quote me on that',
  singleQuotes: 'I can use "double quotes" here',
  lineBreaks: "Look, Mom! \
No \\n's!",
  hexadecimal: 0xdecaf,
  leadingDecimalPoint: .8675309, andTrailing: 8675309.,
  positiveSign: +1,
  trailingComma: 'in objects', andIn: ['arrays',],
  "backwardsCompatible": "with JSON",
}
```

###インストール
```shell:Node.jsの場合
npm install json5
```
```javascript:ブラウザの場合
<script src="https://unpkg.com/json5@^2.0.0/dist/index.min.js"></script>
```

###使用方法
```javascript
const JSON5 = require('json5')

// 文字列textをJSON5として解析し、JSオブジェクトに変換
const obj = JSON5.pares(text)

// JSオブジェクトをJSON5文字列に変換
const text = JSON5.stringify(obj)
```



##CSON
CSON(CoffeeScript-Object-Notation)は、CoffeeScript記法を基にしたデータ形式。

###サンプル
```javascript:CSONの例
{
  "greatDocumentaries": [
    "earthlings.com",
    "forksoverknives.com",
    "cowspiracy.com"
  ],
  "importantFacts": {
    "emissions": "Livestock and their byproducts account for at least 32,000 million tons of carbon dioxide (CO2) per year, or 51% of all worldwide greenhouse gas emissions.\nGoodland, R Anhang, J. “Livestock and Climate Change: What if the key actors in climate change were pigs, chickens and cows?”\nWorldWatch, November/December 2009. Worldwatch Institute, Washington, DC, USA. Pp. 10–19.\nhttp://www.worldwatch.org/node/6294",
    "landuse": "Livestock covers 45% of the earth’s total land.\nThornton, Phillip, Mario Herrero, and Polly Ericksen. “Livestock and Climate Change.” Livestock Exchange, no. 3 (2011).\nhttps://cgspace.cgiar.org/bitstream/handle/10568/10601/IssueBrief3.pdf",
    "burger": "One hamburger requires 660 gallons of water to produce – the equivalent of 2 months’ worth of showers.\nCatanese, Christina. “Virtual Water, Real Impacts.” Greenversations: Official Blog of the U.S. EPA. 2012.\nhttp://blog.epa.gov/healthywaters/2012/03/virtual-water-real-impacts-world-water-day-2012/\n“50 Ways to Save Your River.” Friends of the River.\nhttp://www.friendsoftheriver.org/site/PageServer?pagename=50ways",
    "milk": "1,000 gallons of water are required to produce 1 gallon of milk.\n“Water trivia facts.” United States Environmental Protection Agency.\nhttp://water.epa.gov/learn/kids/drinkingwater/water_trivia_facts.cfm#_edn11",
    "more": "http://cowspiracy.com/facts"
  }
}
```


###インストール
```shell
npm install cson
```

###使用方法

```javascript
const CSON = require('cson')

// 文字列textをCSONとして解析し、JSオブジェクトに変換
const obj = CSON.pares(text)

// JSオブジェクトをCSON文字列に変換
const text = CSON.stringify(obj)
```


##HTML/XML/RSS
[cheerio](https://www.npmjs.com/package/cheerio)は、コアjQueryのサブセット。

###インストール

```shell
npm install cheerio
```

###使用方法

```javascript
const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')
 
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
 
$.html()
//=> <html><head></head><body><h2 class="title welcome">Hello there!</h2></body></html>
```


##YAML
YAML（ヤムル、YAML Ain't a Markup Language）は、JSONのスーパーセットです。
設定ファイルによく使われています。

###サンプル

```yaml:リスト
--- # お好みの映画、ブロック形式
- Casablanca
- Spellbound
- Notorious
--- # 買い物リスト、インライン形式、またはフロー形式
[milk, bread, eggs]
```

```yaml:連想配列
 --- # ブロック
 name: John Smith
 age: 33
 --- # インライン
 {name: John Smith, age: 33}
```

###インストール

```shell:js-yamlのインストール
npm install js-yaml
```

###使用方法

```javascript:YAMLの使用方法
const yaml = require('js-yaml')

const obj = yaml.safeLoad(txt)
for (var i in obj.items) {
  const it = obj.items[i]
  console.log(it.name, it.price)
}
```


##INI
INI（イニ）ファイルは、昔から設定ファイルによく使われています。

###サンプル
```ini:INIファイル
[section1]
name1=value1
name2=value2

[section2]
name3=value3
```

###インストール
```shell:iniのインストール
npm install ini
```


###使用方法
```javascript:iniの使用方法
const ini = require('ini')

const obj = ini.parse(txt)

for (const name in obj) {
  const it = obj[name]
  console.log(name, it.price, it.color)
}
```

##CSV
[RFC4180](http://www.kasai.fm/wiki/rfc4180jp)準拠の[comma-separated-values](https://www.npmjs.com/package/comma-separated-values)を使う。


###サンプル
```
"aaa","bbb","ccc"
zzz,yyy,xxx
```

###インストール
```shell:node.jsの場合
npm install comma-separated-values
```

```javascript:ブラウザの場合
<script src="csv.min.js"></script>
```


###使用方法
```javascript
const CSV = require('comma-separeted-values')

const csv = new CSV(txt, {header:fales)}
const records = csv.parse()
```


##Word/Excel/Powerpoint
[officegen](https://www.npmjs.com/package/officegen)は、Microsoft Office 2007以降用のOffice Open XMLファイル（Word、Excel、Powerpoint）を、外部ツールなしで純粋なJavaScriptで作成します。

###インストール
```
npm install officegen
```

###使用方法
```javascript
const officegen = require('officegen')
const fs = require('fs')
 
// Create an empty Excel object:
let xlsx = officegen('xlsx')
 
// Officegen calling this function after finishing to generate the xlsx document:
xlsx.on('finalize', function(written) {
  console.log(
    'Finish to create a Microsoft Excel document.'
  )
})
 
// Officegen calling this function to report errors:
xlsx.on('error', function(err) {
  console.log(err)
})
 
let sheet = xlsx.makeNewSheet()
sheet.name = 'Officegen Excel'
 
// Add data using setCell:
 
sheet.setCell('E7', 42)
sheet.setCell('I1', -3)
sheet.setCell('I2', 3.141592653589)
sheet.setCell('G102', 'Hello World!')
 
// The direct option - two-dimensional array:
 
sheet.data[0] = []
sheet.data[0][0] = 1
sheet.data[1] = []
sheet.data[1][3] = 'some'
sheet.data[1][4] = 'data'
sheet.data[1][5] = 'goes'
sheet.data[1][6] = 'here'
sheet.data[2] = []
sheet.data[2][5] = 'more text'
sheet.data[2][6] = 900
sheet.data[6] = []
sheet.data[6][2] = 1972
 
// Let's generate the Excel document into a file:
 
let out = fs.createWriteStream('example.xlsx')
 
out.on('error', function(err) {
  console.log(err)
})
 
// Async call to generate the output file:
xlsx.generate(out)
```


##PDF
[html-pdf](https://www.npmjs.com/package/html-pdf)は、開発終了のPhantomJSを使っているので使用は避けたいけれども。


###インストール
```shell:html-pdfのインストール
npm install html-pdf
```

###使用方法

```javascript:html-pdf使用方法
ar fs = require('fs');
var pdf = require('html-pdf');
var html = fs.readFileSync('./test/businesscard.html', 'utf8');
var options = { format: 'Letter' };
 
pdf.create(html, options).toFile('./businesscard.pdf', function(err, res) {
  if (err) return console.log(err);
  console.log(res); // { filename: '/app/businesscard.pdf' }
});
```