Upgrade to Pro — share decks privately, control downloads, hide ads and more …

イテレーターとジェネレーターで巨大CSVをサクッとプレビューしたい

Avatar for Yuki Yata Yuki Yata
August 17, 2026
170

 イテレーターとジェネレーターで巨大CSVをサクッとプレビューしたい

Avatar for Yuki Yata

Yuki Yata

August 17, 2026

Transcript

  1. 1-1. イテレーターを構成する3つの要素 イテラブルなオブジェクト: イテレーターを持つオブジェクト 正確には「 [Symbol.iterator] を呼び出した時にイテレーターが返るオブジェクト」 配列や文字列、MapやSetなど イテレーター: 順番にイテレーターリザルトを取り出すことができるオブジェクト

    イテレーターリザルトを返却するnext()が実装されている イテレーターリザルト: valueとdoneを持つオブジェクト value: 配列で言うところのそれぞれの要素の値 done: 終了しているかどうかのフラグ © LayerX Inc. 7
  2. 1-1. イテレーターを構成する3つの要素 イテラブルなオブジェクト: イテレーターを持つオブジェクト 正確には「 [Symbol.iterator] を呼び出した時にイテレーターが返るオブジェクト」 配列や文字列、MapやSetなど イテレーター: 順番にイテレーターリザルトを取り出すことができるオブジェクト

    イテレーターリザルトを返却するnext()が実装されている イテレーターリザルト: valueとdoneを持つオブジェクト value: 配列で言うところのそれぞれの要素の値 done: 終了しているかどうかのフラグ ↑長い! © LayerX Inc. 8
  3. 1-1. これだけ覚えて欲しいこと 説明済: for of で回せるものの中にはイテレーターというオブジェクトがいる for of で回すと、イテレーターの中にある next()

    というメソッドが呼び出されて、次 の値を取得してくれる next() © LayerX Inc. の呼び出しを繰り返していくことで順番に値が取り出されていく 9
  4. 2-2. サンプルを書き直してみる 4行になる と書いたらジェネレーター関数になる yield という特殊なキーワードを使う function*() © LayerX Inc.

    通常の関数でいう所の return yield まで到達すると値を返すのに加えて、実行がそこで止まる。変数の値を保持したまま止まる 次の next() が呼び出されたら続きから再開する 17
  5. 3-3. 方針:64KB ずつ読む 全部読むのをやめて、 file.stream() で 64KB ずつ読む stream は非同期イテラブル

    → for await...of で回せる 下までスクロールしたら next() で次の64KBを読んでいく ただし1つ問題が...チャンクはサイズで切られるので、行の真ん中で切れる →チャンクの末尾と次のチャンクの先頭をくっつけてあげる必要がある © LayerX Inc. 21