ktsn-ud commited on
Commit
b1ec9f2
·
1 Parent(s): 7f1a18e

企画データのビルドスクリプトを作成

Browse files
config/files.json CHANGED
@@ -1,5 +1,11 @@
1
  {
2
- "sudachi_config": "scripts/sudachi.json",
3
- "user_dict": "resources/user_dict.csv",
4
- "user_dict_generated": "data/generated/user.dic"
 
 
 
 
 
 
5
  }
 
1
  {
2
+ "sudachi": {
3
+ "sudachi_config": "scripts/sudachi.json",
4
+ "user_dict": "resources/user_dict.csv",
5
+ "user_dict_generated": "data/generated/user.dic"
6
+ },
7
+ "projects": {
8
+ "original_csv": "resources/test_data.csv",
9
+ "projects_json": "data/generated/projects.json"
10
+ }
11
  }
scripts/2_create_projects_data.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+ import pandas as pd
4
+
5
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
6
+
7
+ from utils.logger import setup_logger
8
+ from utils.path import get_file_path_from_config
9
+ from utils.text_process import remove_invisible_chars
10
+ from utils.io import json_dumps
11
+ import schemas.projects as projects
12
+
13
+ # --- ロギングの設定 ---
14
+ log = setup_logger(__name__)
15
+
16
+
17
+ def main():
18
+ """
19
+ CSVファイルを読み込み、Projectオブジェクトのリストを生成し、
20
+ project.jsonに書き出すスクリプト
21
+ """
22
+
23
+ log.info("企画データの生成を開始します。")
24
+ original_csv_path = get_file_path_from_config(
25
+ "original_csv", "resources/original_projects.csv"
26
+ )
27
+ output_json_path = get_file_path_from_config(
28
+ "output_json", "data/generated/projects.json"
29
+ )
30
+
31
+ # CSVファイルの読み込み
32
+ try:
33
+ df = pd.read_csv(original_csv_path, encoding="utf-8")
34
+ except FileNotFoundError:
35
+ log.error(f"CSVファイルが見つかりません: {original_csv_path}")
36
+ return
37
+ except pd.errors.ParserError as e:
38
+ log.error(f"CSVファイルの解析中にエラーが発生しました: {e}")
39
+ return
40
+ except Exception as e:
41
+ log.error(f"予期しないエラーが発生しました: {e}")
42
+ return
43
+
44
+ # テキスト列に対して不要な文字の除去を行う
45
+ for col in df.select_dtypes(include=["object"]).columns:
46
+ df[col] = df[col].apply(
47
+ lambda x: remove_invisible_chars(x) if isinstance(x, str) else x
48
+ )
49
+
50
+ # 一旦全列 object にしてから欠損値を None に変換
51
+ df = df.astype("object").where(pd.notnull(df), None)
52
+
53
+ # Projectオブジェクトに変換
54
+ # 列名がキーと一致している前提
55
+ projects_list: list[projects.Project] = [
56
+ projects.Project(**row) for row in df.to_dict(orient="records")
57
+ ]
58
+
59
+ # JSON に書き出し
60
+ json_dumps(projects_list, output_json_path)
61
+
62
+ log.info(f"企画データの生成が完了しました: {output_json_path}")
63
+
64
+
65
+ if __name__ == "__main__":
66
+ main()
utils/io.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from pathlib import Path
3
+ from typing import Any
4
+
5
+
6
+ def _write_atomic(path: Path, data: str) -> None:
7
+ temp = path.with_suffix(path.suffix + ".tmp")
8
+ temp.write_bytes(data)
9
+ temp.replace(path)
10
+
11
+
12
+ def json_dumps(obj: Any, path: str | Path) -> None:
13
+ """
14
+ オブジェクトをJSON形式のファイルに書き出す。
15
+ """
16
+ json_bytes = json.dumps(obj, ensure_ascii=False, indent=2).encode("utf-8")
17
+ _write_atomic(Path(path), json_bytes)
utils/text_process.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+
3
+ # U+202a (LRE) やその他の目に見えない制御文字を除去するための正規表現
4
+ # ref: https://www.compart.com/en/unicode/category/Cf
5
+ INVISIBLE_CHARS_PATTERN = re.compile(r"[\u200b-\u200c\u200e-\u200f\u202a-\u202e\ufeff]")
6
+
7
+
8
+ def remove_invisible_chars(text: str) -> str:
9
+ """
10
+ 文字列から目に見えない制御文字やフォーマット文字を除去する。
11
+ """
12
+ if not isinstance(text, str):
13
+ return text
14
+ return INVISIBLE_CHARS_PATTERN.sub("", text)