<commit_before>---
rid: 1492530
bid: javascript
rcd: nodejs-code-tips
srcpath: javascript/nodejs-code-tips.adoc
title: Node.js CODE TIPS
category: JavaScript
date: 2017.4.19
layout: refill.jade
---

== ファイル読み込み

テキストファイルの読み込みである場合`'utf-8'`のようにエンコーディングを指定する。

- File System | Node.js Documentation
  * `link:https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options[fs.readFileSync(path\[, options\])]`
  * `link:https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback[fs.readFile(path\[, options\], callback)]`

[source,javascript]
----
const fs = require('fs');

// sync
const text = fs.readFileSync('./input.txt', 'utf8');

// async
fs.readFile('./input.txt', 'utf8', function(err, text) {
  if (err) throw err;
  console.log(text);
});
----


== ファイル書き込み

[source,javascript]
----
require('fs').writeFile('out.txt', 'content', (e)=>{});
----


== 1列読み込み

.sample.txt
[source]
----
red
blue
green
yellow
----

[source,javascript]
----
const fs = require('fs');
const content = fs.readFileSync('sample.txt').toString();
const colors = content.trim().split('\n');
//=> [ 'red', 'blue', 'green', 'yellow' ]
----


== CSV読み込み

.sample.csv
[source]
----
fruit
apple
#banana
orange
lemon
----

.function readCsvSync
[source,javascript]
----
function readCsvSync(filename, options) {
  const fs = require('fs');
  const parse = require('csv-parse/lib/sync');
  const content = fs.readFileSync(filename).toString();
  return parse(content, options);
}
----

.use header
[source,javascript]
----
const options = { columns: true, comment: '#' };
const records = readCsvSync('sample.csv', options);
/*
[ { fruit: 'apple' },
  { fruit: 'orange' },
  { fruit: 'lemon' } ]
*/
----

.indicate columns
[source,javascript]
----
const options = { columns: ['id'], comment: '#' };
const records = readCsvSync('sample.csv', options);
/*
[ { id: 'fruit' },
  { id: 'apple' },
  { id: 'orange' },
  { id: 'lemon' } ]
*/
----


== glob

- link:https://github.com/isaacs/node-glob[isaacs/node-glob: glob functionality for node.js]

```bash
npm i glob
```

```js
const glob = require('glob');

glob.sync("**/*.js", options, function(er, files) {
  // files is an array of filenames.
});
```


== tktk

- link:https://www.npmjs.com/package/tktk[tktk]
<commit_msg>:memo: Node.js URL<commit_after>---
rid: 1492530
bid: javascript
rcd: nodejs-code-tips
srcpath: javascript/nodejs-code-tips.adoc
title: Node.js CODE TIPS
category: JavaScript
date: 2017.4.19
layout: refill.jade
---

== ファイル読み込み

テキストファイルの読み込みである場合`'utf-8'`のようにエンコーディングを指定する。

- File System | Node.js Documentation
  * `link:https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options[fs.readFileSync(path\[, options\])]`
  * `link:https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback[fs.readFile(path\[, options\], callback)]`

[source,javascript]
----
const fs = require('fs');

// sync
const text = fs.readFileSync('./input.txt', 'utf8');

// async
fs.readFile('./input.txt', 'utf8', function(err, text) {
  if (err) throw err;
  console.log(text);
});
----


== ファイル書き込み

[source,javascript]
----
require('fs').writeFile('out.txt', 'content', (e)=>{});
----


== 1列読み込み

.sample.txt
[source]
----
red
blue
green
yellow
----

[source,javascript]
----
const fs = require('fs');
const content = fs.readFileSync('sample.txt').toString();
const colors = content.trim().split('\n');
//=> [ 'red', 'blue', 'green', 'yellow' ]
----


== CSV読み込み

.sample.csv
[source]
----
fruit
apple
#banana
orange
lemon
----

.function readCsvSync
[source,javascript]
----
function readCsvSync(filename, options) {
  const fs = require('fs');
  const parse = require('csv-parse/lib/sync');
  const content = fs.readFileSync(filename).toString();
  return parse(content, options);
}
----

.use header
[source,javascript]
----
const options = { columns: true, comment: '#' };
const records = readCsvSync('sample.csv', options);
/*
[ { fruit: 'apple' },
  { fruit: 'orange' },
  { fruit: 'lemon' } ]
*/
----

.indicate columns
[source,javascript]
----
const options = { columns: ['id'], comment: '#' };
const records = readCsvSync('sample.csv', options);
/*
[ { id: 'fruit' },
  { id: 'apple' },
  { id: 'orange' },
  { id: 'lemon' } ]
*/
----


== glob

- link:https://github.com/isaacs/node-glob[isaacs/node-glob: glob functionality for node.js]

```bash
npm i glob
```

```js
const glob = require('glob');

glob.sync("**/*.js", options, function(er, files) {
  // files is an array of filenames.
});
```


== URL Path Join

`url.resolve(from, to)` を使用する。
from で指定された URL を起点にして to という行き先を命令された場合に
結局どこに行くのかを解明した結果を返す。
from は `http://` で開始する必要はない。
逆に to が `http://` から始まる URL でもよい。
それは外部サイトに移動する時と同じ挙動と言える。

- link:https://nodejs.org/api/url.html#url_url_resolve_from_to[url.resolve(from, to) - URL | Node.js Documentation]
- link:https://stackoverflow.com/questions/16301503/can-i-use-requirepath-join-to-safely-concatenate-urls[node.js - Can I use require("path").join to safely concatenate urls? - Stack Overflow]

```js
url.resolve('/japan/tokyo/shibuya', 'ebisu')
//=> '/japan/tokyo/ebisu'
url.resolve('http://world.com', 'japan')
//=> 'http://world.com/japan'
url.resolve('http://world.com/japan/tokyo/', '/america/new-york')
//=> 'http://world.com/america/new-york'
url.resolve('http://world.com', 'https://google.com')
//=> 'https://google.com/'
```


== tktk

- link:https://www.npmjs.com/package/tktk[tktk]

{'fraction_non_alphanumeric': 0.21601489757914338, 'fraction_numerical': 0.00819366852886406, 'mean_word_length': 3.8871701546860784, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 11, 'https://': 12, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4254418', 'n_tokens_mistral': 2220, 'n_tokens_neox': 2128, 'n_words': 386}