large-scale-text-editing について
非常に大きなテキストファイルの変換を計画し、結果を検証するためのスキルです。区切りデータや反復編集を対象に、サンプリング、ツール選択、段階的テスト、安全策を扱います。
主な機能
- 01全件を読まずにファイルを抽出確認
- 02Vim、sed、awk、Perl、Pythonから選択
- 03変換をテスト可能な工程に分割
- 04ファイルの直接編集前にバックアップ
- 05行数、差分、サンプルで結果を検証
活用シーン
- 01大規模な区切りファイルの列を並べ替え・削除
- 02パターンに基づく反復編集の一括適用
- 03キー入力数や操作数の制約への対応
- 04複数箇所の変換結果を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ letta-ai/ skills --skill large-scale-text-editingインストール後、Claude Code で/large-scale-text-editingを入力して読み込まれたか確認します。
詳細
大規模なテキスト編集
概要
このスキルでは、数千行から数百万行を含む大規模なテキストファイルを効率的に変換する方法を説明します。変換要件の把握、効率的なソリューション(特に Vim マクロ)の設計、テスト方法、検証手法を取り上げます。
このスキルを使用する場面
- CSV、TSV、またはその他の区切り形式のファイルを大規模に変換する場合
- 数百万行のファイル全体に繰り返し編集を適用する場合
- キーストローク数や操作回数に制限がある場合
- Vim マクロ、sed、awk などの一括処理ツールを使用する場合
- 正規表現を必要とするパターンベースのテキスト変換を行う場合
アプローチの方針
フェーズ 1:変換内容を把握する
変換ロジックを書く前に、次のことを行います。
-
まずファイルサイズを確認する - 読み込みを試みる前に、
ls -lhまたはwc -lでファイルサイズを確認します。数百万行のファイルを直接読み込むのは避けてください。 -
複数の場所から計画的にサンプルを抽出する:
- 先頭:
head -n 100 input.csv > sample_head.csv - 中間:
sed -n '500000,500100p' input.csv > sample_middle.csv - 末尾:
tail -n 100 input.csv > sample_tail.csv
- 先頭:
-
入力と期待される出力を比較する - 必要な変換をすべて特定します。
- 列の並べ替えまたは削除
- 区切り文字の変更
- 大文字・小文字の変換
- 空白の処理
- 値の追加または先頭への挿入
- 形式の変換
-
構造に関する前提を確認する:
- すべての行で列数が一貫しているか
- ヘッダー行があるか
- 空行や不正な形式の行があるか
- 正規表現パターンを壊す可能性のある特殊文字があるか
フェーズ 2:ソリューションを設計する
変換を設計する際は、次の点を考慮します。
-
複雑な変換を個別のステップに分割する - 各ステップで、論理的な変換を 1 つ処理するようにします。これによりデバッグしやすくなり、各ステップを個別にテストできます。
-
規模に適したツールを選ぶ:
- Vim マクロ:複雑な複数ステップの変換に最適で、キーストローク数の計算にも効率的です
- sed:大規模なファイルに対する単純な置換を高速に処理します
- awk:列の操作や条件付きロジックに強力です
- Perl/Python:正規表現の機能を超える複雑なロジックに適しています
-
効率を考慮して設計する:
- ファイルを処理する回数を最小限に抑えます
- 明示的なループで反復するのではなく、行単位の操作(Vim の
:%normal!)を使用します - 手動で文字を操作するより、組み込みコマンド(Vim の大文字変換に使う
gUなど)を活用します
-
設計上の判断を記録する - 有効な代替案が複数ある場合は特に、特定の方法を選んだ理由を記録します。
フェーズ 3:段階的にテストする
-
テスト用サンプルを作成する - 初期テストには、100~1000 行の小さなサブセットを使用します。
head -n 100 input.csv > test_input.csv head -n 100 expected.csv > test_expected.csv -
各変換を個別にテストする - 組み合わせる前に、各マクロまたはコマンドが正しい出力を生成することを確認します。
-
diff で検証する - バイト単位で比較します。
diff test_output.csv test_expected.csv -
テスト出力にエッジケースがないか確認する:
- 先頭行と末尾行が正しく変換されている
- 内容の長さが異なる行が適切に処理されている
- 特殊文字が想定どおりに保持または変換されている
フェーズ 4:安全策を講じて実行する
-
インプレースで変更する前にバックアップを作成する:
cp input.csv input.csv.backup -
適切なタイムアウトを設定する - 数百万行のファイルでは、十分な処理時間を確保します(複雑さに応じて、たとえば 2~5 分)。
-
可能であれば進行状況を監視する - 進行状況を表示するツールを使うか、中間出力を確認します。
-
最終出力を検証する:
- 行数が一致することを確認します:
wc -l output.csv - 期待される出力と diff を実行します
- ファイルの異なる場所からサンプルを抜き出して確認します
- 行数が一致することを確認します:
Vim 固有のガイダンス
マクロ設計の原則
- レジスターの割り当て:異なる変換段階には、異なるレジスター(a、b、c)を使用します
- キーストロークの効率化:1 文字ずつ操作するより、組み込みコマンドを優先します
- 正規表現パターン:過剰なマッチを避けるため、最短一致パターンと明示的な区切り文字を使用します
大きなファイルでよく使う Vim パターン
| タスク | 方法 |
|---|---|
| すべての行にマクロを適用する | :%normal! @a |
| 大文字に変換する | gU モーション、または置換で \U |
| 列を操作する | \(\) によるキャプチャグループと、\1、\2 による後方参照 |
| 区切り文字を置換する | :s/old_delim/new_delim/g |
| 空白を削除する | :s/\s\+//g |
Vim スクリプトでのエスケープ
マクロの定義に setreg() を使用する場合:
- バックスラッシュをエスケープします:リテラルのバックスラッシュには
\\を使用します - 復帰改行には
\rを使用します - 特殊文字には二重のエスケープが必要な場合があります
検証チェックリスト
タスクの完了と判断する前に、次の項目を確認します。
- 出力ファイルが存在し、空ではない
- 行数が想定数と一致している
- 利用可能な場合、想定される出力とのバイト単位の差分チェックに合格している
- ファイルの先頭、中間、末尾からサンプルを抜き出して確認している
- キーストローク数の上限やコマンドの制限など、すべての制約を満たしている
- ツールが成功コード(終了コード 0)で終了している
よくある落とし穴
| 落とし穴 | 防止策 |
|---|---|
| 大きなファイルを直接読み込む | まず必ずファイルサイズを確認し、サンプルの取得には head/tail/sed を使用します |
| ファイルをインプレース編集する前にバックアップを取らない | 変更を加える前にバックアップコピーを作成します |
| 最初の数行だけでテストする | ファイルの複数の位置からサンプルを取得します |
| 構造が均一だと思い込む | 異なる位置からサンプルを取得して構造を確認します |
| 正規表現で一致範囲が広くなりすぎる | 明示的な区切り文字と非貪欲量指定子を使用します |
| タイムアウトが不十分 | ファイルサイズから想定処理時間を計算します |
| 終了コードを確認しない | 操作後にツールの終了ステータスを確認します |
効率に関する考慮事項
キーストローク数や操作回数が重要な場合:
- 正確に数える - 特定の状況で「キーストローク」が何を指すのか(エスケープシーケンス、特殊キーなど)を理解します
- 操作を組み合わせる - 1つの正規表現による置換で、複数の単純な操作を置き換えられる場合があります
- 組み込みコマンドを使用する - ネイティブコマンドは通常、手動での同等操作より効率的です
- 重複を最小限にする - ファイルの繰り返し読み込みや冗長な変換を避けます