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" だけ、微妙に構造が違います
ここだけ手作業で直してます別に直さなくても動いた
4. おわりに
はじめてスクリプト言語 Python を触ってみましたが、すごく柔軟でわかりやすいと、感じました。学生の頃にC言語を学ぼうとしましたが、何が書いてあるのか訳もわからず投げ出しました。ChatGPT の力もあり、わからないコードの意味を対話形式で質問できるというのも助かりました。素人でもここまでできる、すごい時代になりました。
この記事が気に入ったらサポートをしてみませんか?