★ 複数ファイルから構成されるプログラムコードのAI解析 ★
【1】はじめに
ChatGPT登場後の生成AIの発展により、簡単なプロンプト入力により既存プログラムを解析してリファクタリングや資料作成などが可能になってきました。
とはいえChatGPT、Copilot、Geminiなど汎用の生成AIの場合、添付できるファイルに上限(20など)があるため、ある程度以上の規模のプログラムでは簡単には解析を行うことができません。
この場合、プログラム専用のAIを使用する方法がありますが有償であり手軽には使用できません。
汎用の生成AIを使用する場合は、複数のプロンプトで分割して入力するか、複数のファイルを1つのファイルにマージするなどの工夫が入ります。
今回、複数のファイルのマージを自動的に行うプログラム(Python)を作りましたので紹介いたします。
【2】マージの方法
生成AIへのファイル添付は、例えば、a.c, b.c, c.cといった複数のファイルをマージするときに、
以下のように、ファイル名をヘッダにつけると、それぞれのソースコードと認識してくれます。
===== a.c =====
#include
...
int main(int argc, void **argv)
{
...
}
===== b.c =====
#include
...
int func_bbb(int arg1, int arg2)
{
...
}
...
===== c.c =====
#include
...
int func_ccc(int arg1, int arg2)
{
...
}
...
合わせて、プロンプトで、AIにファイル数をインプットして下さい。
また、ソースコードが複数のディレクトリに分けて格納されている場合は、以下のようにツリー構造を保存したtree.txtを作成して、合わせて生成AIに添付すると各ソースファイルのディレクトリ構造を生成AIが理解します。
tree /f > tree.txt
【3】マージプログラム
マージプログラムはCopilotで作成したものをベースに手動でカスタマイズしました。
対象とするファイル拡張子はC/C++を指定していますが、同様の方法でPythonやC#等他の言語ファイルも指定可能です。
import os
INPUT_ENCODING = "utf-8" # UTF-8でエンコードされたファイル
# INPUT_ENCODING = "CP932" # WindowsのShift_JIS互換でエンコードされたファイル
# INPUT_ENCODING = "utf-16" # UTF-16でエンコードされたファイル
# INPUT_ENCODING = "euc-jp" # EUC-JPでエンコードされたファイル
def collect_c_and_h_files(input_path, output_filename):
file_count = 0
# 出力ファイル
with open(output_filename, "w", encoding="utf-8") as out_file:
# 指定パス(input_path)以下の *.cpp, *.c, *.h を再帰的に検索
for root, dirs, files in os.walk(input_path):
for file_name in files:
if file_name.endswith((".cpp", ".c", ".h")):
full_path = os.path.join(root, file_name)
# ファイル名を指定形式で出力
out_file.write(f"===== {file_name} =====\n")
# ファイルの中身を INPUT_ENCODING で読み込んで出力
try:
with open(full_path, "r", encoding=INPUT_ENCODING) as src_file:
out_file.write(src_file.read())
except UnicodeDecodeError:
out_file.write(
f"[WARN] {INPUT_ENCODING}で読み込めませんでした\n"
)
# ファイル間の区切り
out_file.write("\n\n")
# 処理したファイル数をカウント
file_count += 1
print(f"{file_count}個のファイルが処理されました。")
if __name__ == "__main__":
#1)入力(1)
input_path = input("検索するディレクトリのパスを入力してください:").strip()
#2)入力(2)
output_filename = input("出力ファイル名を入力してください:").strip()
collect_c_and_h_files(input_path, output_filename)
print("完了しました。")
【4】実行例
以下の例は、"C:\_ito\SRC\DS2\DS2"以下のディレクトリにある*.cpp/*.c/*.hを検索/マージして、"c:\_ito\ds2_src.txt"に保存します。
検索するディレクトリのパスを入力してください:C:\_ito\SRC\DS2\DS2
出力ファイル名を入力してください:C:\_ito\ds2_src.txt
23個のファイルが処理されました。
完了しました。
【5】補足
- ファイル名だけ出していますが、パスを含めたい場合は
out_file.write(f"===== {full_path} =====\n")
に変更できます。
- 今回のソースコードの文字コードは UTF-8 に設定しています。文字コードはINPUT_ENCODINGで指定できますので、必要に応じてコメント(#)を外して下さい。
- 作成したファイルに、"[WARN] XXXXで読み込めませんでした"という文字列が含まれる場合は、文字コード設定を誤っています
- 出力ファイルはutf-8設定にしています。生成AIはutf-8が判断できるためです。
【改訂記録】
2026/04/29版:公開
2026/05/18版:誤記修正
[ホームへ戻る]