見出し画像

Last Epoch 用Pythonスクリプト

テキスト内にダブルクォートが複数あったりするとうまく動かないです
助けて


注意!
スクリプト言語はじめての素人が
ChatGPTの力を借りて1時間で書いたコードです
間違い等があると思います、ご了承お願いします

0. Pythonをインストールする

ChatGPTにテキストを整形する方法を聞いたら、これが一番いいらしい
インストール方法は下の記事を見ました

1. txtをcsvに変換する

翻訳テキストを抽出する方法を書きましたが
その際にできるテキストファイルを整形する方法です

下の画像のようなテキストファイルがエクスポートできましたが
翻訳に必要なのは赤い枠のフィールド値だけです

赤枠の値だけ正規表現で抽出し、Googleスプレッドシートで読み込める
csv形式にします、そして翻訳したあと、元のオレンジ枠のテキストを追加し
txt形式に戻します

1.1 下処理ファイルの作成

元に戻せるようにオレンジ枠のテキストをとっておきます
ファイル先頭とファイル末尾のテキストを正規表現で抽出します
そして "下処理ファイル.csv" という名前で保存します

下のコードをメモ帳等にコピペしたあと、"0_下処理ファイルの作成.py"
という名前で保存します

import re
import csv
import sys
import os

def extract_data_from_text(input_text):
    # テキストを抽出
    pattern = r'(^.*? 0 TableEntryData m_TableData.*?)\n   \[0\].*?( 0 ManagedReferencesRegistry references\n.*)\n'
    extracted_items = re.findall(pattern, input_text, re.DOTALL)
    return extracted_items

def process_files(file_paths):
    data = {}
    for file_path in file_paths:
        file_name = os.path.basename(file_path)
        # 正規表現を使用して不要な部分を削除し、新しいファイル名を生成
        modified_file_name = re.sub(r'-CAB.*?.txt', '.txt', file_name)

        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                input_text = file.read()

            extracted_items = extract_data_from_text(input_text)

            if extracted_items:
                data[modified_file_name] = extracted_items
            else:
                print(f"ファイル '{file_name}' から抽出されたテキストが見つかりませんでした")
        except Exception as e:
            print(f"ファイル '{file_name}' の処理中にエラーが発生しました: {str(e)}")

    return data

def main():
    if len(sys.argv) < 2:
        print("ファイルが指定されていません。ファイルをスクリプトにドラッグ&ドロップしてください。")
        return

    file_paths = sys.argv[1:]

    data = process_files(file_paths)

    if data:
        csv_file_path = "下処理ファイル.csv"
        with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
            csv_writer = csv.writer(csv_file, delimiter=',')  # カンマ区切り
            csv_writer.writerow(["ファイル名", "■先頭テキスト■", "■末尾テキスト■"])  # ヘッダー行
            for file_name, extracted_items in data.items():
                for item in extracted_items:
                    replace_text1, replace_text2 = item
                    csv_writer.writerow([file_name, replace_text1, replace_text2])
        print(f"CSVファイルにデータを保存しました: {csv_file_path}")
    else:
        print("抽出されたテキストが見つかりませんでした")

if __name__ == "__main__":
    main()

編集前のファイル群をドラッグ&ドロップ
"下処理ファイル.csv" ができたら準備完了です

1.2 csvに変換

下のコードを同じくメモ帳で "1_txt2csv.py" と保存します

import re
import csv
import argparse
import os

def extract_data_from_text(input_text):
    # 正規表現パターン
    pattern = r'0 TableEntryData m_TableData(.*?)0 ManagedReferencesRegistry references'

    # 正規表現を使用してテキストを抽出
    match = re.search(pattern, input_text, re.DOTALL)

    if match:
        extracted_text = match.group(1).strip()

        # テキストを抽出
        pattern2 = r'\[([0-9]+)\]\s    0 TableEntryData data.*?SInt64 m_Id = ([0-9]+).*?string m_Localized = \"(.*?)\"\s'
        extracted_items = re.findall(pattern2, extracted_text, re.DOTALL)

        return extracted_items
    else:
        return None

def process_file(input_file_path):
    try:
        with open(input_file_path, 'r', encoding='utf-8') as file:
            input_text = file.read()

        extracted_items = extract_data_from_text(input_text)

        if extracted_items:

            file_name = os.path.basename(input_file_path)
            # 正規表現を使用して不要な部分を削除し、新しいファイル名を生成
            csv_file_path = re.sub(r'-CAB.*?.txt', '.csv', file_name)

            with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
                csv_writer = csv.writer(csv_file, delimiter=',')  # カンマ区切り
                csv_writer.writerow(["Index", "m_Id", "原文"])  # ヘッダー行
                for item in extracted_items:
                    index, m_id, m_localized = item
                    csv_writer.writerow([index.strip(), m_id.strip(), m_localized.strip()])
            print(f"CSVファイルにデータを保存しました: {csv_file_path}")
        else:
            print(f"ファイル {input_file_path} から抽出されたテキストが見つかりませんでした")
    except Exception as e:
        print(f"ファイル {input_file_path} を処理中にエラーが発生しました: {str(e)}")

def main():
    parser = argparse.ArgumentParser(description="テキストデータからデータを抽出し、CSVファイルに保存します")
    parser.add_argument('input_files', nargs='+', help="処理対象のファイル")
    args = parser.parse_args()

    for input_file in args.input_files:
        process_file(input_file)

if __name__ == "__main__":
    main()

ファイル群をスクリプトにドラッグ&ドロップ、csvファイルができます
その際にファイル名の後ろの邪魔な数字も取り除いています

1.3 Googleスプレッドシートへ

試しにGoogleスプレッドシートにインポートしてみます

大丈夫そうですね

2. csvをtxtに戻す

ある程度翻訳が終わったら、txtに戻してみます
私の作業スペースは画像のよう6列になっていて
ほしいのは [Index] [m_Id] [m_Localized] の列です

列数や、位置が違う場合は下の部分を変えてください

index, m_id, source, translate1, translate2, m_localized = row

では、下のコードを同じくメモ帳で "2_csv2txt.py" と保存します

import csv
import argparse
import os

def process_csv_to_txt(csv_file_path):
    try:
        # ファイル名から拡張子を取り除く
        base_filename, ext = os.path.splitext(csv_file_path)
        if ext.lower() != ".csv":
            print(f"指定されたファイル {csv_file_path} はCSVファイルではありません。")
            return

        # 新しい拡張子を持つテキストファイルのパスを生成
        txt_file_path = base_filename + ".txt"

        with open(csv_file_path, 'r', newline='', encoding='utf-8') as csv_file:
            csv_reader = csv.reader(csv_file, delimiter=',')  # カンマ区切り

            # ヘッダーをスキップ
            next(csv_reader, None)

            # テキストデータを生成
            text_data = "■先頭テキストを挿入■\n"
            for row in csv_reader:
                index, m_id, source, translate1, translate2, m_localized = row
                text_data += f"   [{index}]\n    0 TableEntryData data\n     0 SInt64 m_Id = {m_id}\n     1 string m_Localized = \"{m_localized}\"\n     0 MetadataCollection m_Metadata\n      0 IMetadata m_Items\n       0 Array Array (0 items)\n        0 int size = 0\n"

            text_data += "■末尾テキストを挿入■\n"

            # テキストファイルにデータを保存
            with open(txt_file_path, 'w', encoding='utf-8') as txt_file:
                txt_file.write(text_data)

            print(f"テキストファイルにデータを保存しました: {txt_file_path}")

    except FileNotFoundError:
        print(f"ファイルが見つかりません: {csv_file_path}")
    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")

def main():
    parser = argparse.ArgumentParser(description="CSVファイルからテキストファイルを生成します")
    parser.add_argument('csv_files', nargs='+', help="処理対象のCSVファイル")

    args = parser.parse_args()

    for csv_file in args.csv_files:
        process_csv_to_txt(csv_file)

if __name__ == "__main__":
    main()

スプレッドシートからダウンロードしたcsvファイルをドラッグ&ドロップ

大丈夫そう

3. 消した部分を戻す

さいごに、消したオレンジ枠のテキストを戻します

下のコードをメモ帳で "3_下処理ファイルを元に置換.py" と保存します
"下処理ファイル.csv" と同じディレクトリに置いてください

import argparse
import csv
import os

def process_text_file(text_file_path, data_dict):
    for csv_filename, (start_text, end_text) in data_dict.items():
        if csv_filename in os.path.basename(text_file_path):
            with open(text_file_path, 'r', encoding='utf-8') as f:
                content = f.read()

            content = content.replace('■先頭テキストを挿入■', start_text)
            content = content.replace('■末尾テキストを挿入■', end_text)

            with open(text_file_path, 'w', encoding='utf-8') as f:
                f.write(content)

def main():
    parser = argparse.ArgumentParser(description="テキストファイルの処理")
    parser.add_argument('paths', nargs='+', help="処理対象のファイルまたはフォルダのパス")
    args = parser.parse_args()

    paths = args.paths

    csv_file = '下処理ファイル.csv'
    data_dict = {}
    with open(csv_file, 'r', newline='', encoding='utf-8') as csv_file:
        csv_reader = csv.DictReader(csv_file, delimiter=',')
        for row in csv_reader:
            data_dict[row['ファイル名']] = (row['■先頭テキスト■'], row['■末尾テキスト■'])

    for path in paths:
        if os.path.isdir(path):
            for root, _, files in os.walk(path):
                for file in files:
                    if file.endswith(".txt"):
                        text_file_path = os.path.join(root, file)
                        process_text_file(text_file_path, data_dict)
        else:
            if path.endswith(".txt"):
                process_text_file(path, data_dict)
            else:
                print(f"{path}: サポートされていないファイルまたはフォルダの形式です.")

if __name__ == "__main__":
    main()

スクリプトにドラッグ&ドロップする前に…
ファイル名が変わっているので直します

ドラッグ&ドロップしたら、バックアップも作らず上書きします(怖いですね)
これで、ゲームに読み込める形になりました!

ファイル名が部分一致でも置換するようにしたかったのですが
いくらChatGPTにお願いしても完全一致から変わらなかったので諦めました

3.1 備考

"UI_en.txt" だけ、微妙に構造が違います

[27] だけ違う

ここだけ手作業で直してます
別に直さなくても動いた

4. おわりに

はじめてスクリプト言語 Python を触ってみましたが、すごく柔軟でわかりやすいと、感じました。学生の頃にC言語を学ぼうとしましたが、何が書いてあるのか訳もわからず投げ出しました。ChatGPT の力もあり、わからないコードの意味を対話形式で質問できるというのも助かりました。素人でもここまでできる、すごい時代になりました。


この記事が気に入ったらサポートをしてみませんか?