環境
やりたいこと
エクセルではシフトJIS(CP932)のCSVしか読めないので、UTF-8のCSVは悲しいことに文字化けしてしまう。
文字コードを変換したい
コマンド
cat users.csv| nkf -s --cp932 --fb-subchar=0x3013 > users_cp932.csv
例えば以下のような配列があったとする。
const fruits = [ "りんご", "バナナ", "オレンジ", "いちご", "ぶどう", "メロン", "パイナップル", "マンゴー", "スイカ", "さくらんぼ" ];
この中から重複せずにランダムに3つ取得したい。
function getRandomElements<T>(arr: T[], count: number): T[] { if (count > arr.length) { throw new Error('Count is greater than the array length'); } const result: T[] = []; const usedIndices: Set<number> = new Set(); while (result.length < count) { const randomIndex = Math.floor(Math.random() * arr.length); if (!usedIndices.has(randomIndex)) { usedIndices.add(randomIndex); result.push(arr[randomIndex]); } } return result; }
実行すると
getRandomElements(fruits, 3) > ['さくらんぼ', 'ぶどう', 'マンゴー'] getRandomElements(fruits, 2) > ['りんご', 'パイナップル']
のようにできる。
getRandomElements<T>(arr: T[], count: number): T[]
関数の定義:
<T>
を使って、任意の型の配列を受け取れるようにする。if (count > arr.length)
で、要求した要素数が配列の長さを超えないことを確認。超えた場合はエラーをスロー。result
と、使用したインデックスを管理するための Set
型の usedIndices
を定義。while (result.length < count)
で、必要な数のランダムな要素が取得できるまでループ。Math.random()
を使ってランダムなインデックスを生成。usedIndices
に存在しない場合のみ、結果に追加する。Set
を使用しているため、インデックスの管理が効率的。LLMはモデルごとにトークン数が異なる。簡単に比較できるサイト見つけたのでメモ
複数行の文字列を変数として持っておきたいので、ここではテンプレートリテラルを使う。テンプレートリテラルは、JavaScript(およびTypeScript)の便利な機能で、複数行の文字列を簡潔に扱える。この機能の主なメリットは以下の通りだ。
可読性の向上: コードをそのまま書けるため、文字列の内容を確認しやすい。通常の文字列とは異なり、改行やインデントもそのまま表現できる。
変数埋め込みが簡単:
${}
の形式を使うことで、文字列内に変数や式を埋め込むことができ、動的な文字列生成が容易になる。
長いメッセージやテンプレートの管理が改善: HTMLやMarkdownなどの長い文を管理する際に、テンプレートリテラルを使うと、コードがすっきりする。
例えば以下のTypeScriptコードがあったとする。
const hogehoge = () => { return ` 複数行でインデントが入ってる文章 複数行でインデントが入ってる文章 `; }; console.log(hogehoge());
上のサンプルコードでは、テンプレートリテラルを使って生成した文字列には、インデントがそのまま出力に反映されてしまう。この場合、意図しない空白が入ってしまうことがある。
❯ npx -y tsx ./src/scripts/dedent.ts 複数行でインデントが入ってる文章 複数行でインデントが入ってる文章
TypeScriptなので、ts-dedentを使う
npm install ts-dedent
テンプレートリテラルのバッククオート前に「dedent」と書くだけ。さっきのサンプルコードに反映させてみる。
import dedent from 'ts-dedent'; const hogehoge = () => { return dedent` 複数行でインデントが入ってる文章 複数行でインデントが入ってる文章 `; }; console.log(hogehoge());
するとちゃんと不要な空白をトリムしてくれて本来出力したかったテキストになっている。
❯ npx -y tsx ./src/scripts/dedent.ts 複数行でインデントが入ってる文章 複数行でインデントが入ってる文章
ts-dedent
を使用する際の注意点は、使用するテンプレートリテラルの内容によっては、期待通りに動作しない場合があることだ。特にインデントの管理においては、どの程度の空白を取り除くかを必ず確認する必要がある。意図しないトリミングが発生することもあるため、特に注意して扱うこと。
dedent
は非常に便利なツールだが、使い方を誤ると意図しないフォーマットで出力される原因となるため、しっかりとテストしてから運用することが望ましい。