File size: 2,481 Bytes
88435ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import csv
import glob
import json
from concurrent.futures import Future, ThreadPoolExecutor
from typing import Any, Callable, TypeVar

_T = TypeVar("_T")


def execute_parallel(func: Callable[..., _T], kwargs_list: list[dict[str, Any]], max_workers: int) -> list[_T]:
    """並行処理を行う

    Args:
        func (Callable): 並行処理したい関数
        kwargs_list (list[dict[str, Any]]): 関数の引数(dict型)のリスト
        max_workers (int): 並行処理数

    Returns:
        list[Any]: 関数の戻り値のリスト
    """
    response_list: list[Future[_T]] = []
    with ThreadPoolExecutor(max_workers=max_workers) as e:
        for kwargs in kwargs_list:
            response: Future[_T] = e.submit(func, **kwargs)
            response_list.append(response)
    return [r.result() for r in response_list]


def _load_json_file(file_path: str) -> Any:
    # TODO: Docstring追加
    with open(file_path, "r", encoding="utf-8") as json_file:
        data = json.load(json_file)
    return data


def make_log_csv(log_dir: str, csv_file_name: str = "log.csv") -> None:
    """ログデータのcsvを保存

    Args:
        log_dir (str): ログデータが保存されているディレクトリ
        csv_file_name (str, optional): 保存するcsvファイル名. Defaults to "log.csv".
    """
    # ディレクトリ内のJSONファイルのリストを取得
    # TODO: エラーキャッチ
    json_files = sorted([f for f in glob.glob(f"{log_dir}/*.json")], key=lambda x: int(x.split("/")[-1].split(".")[0]))

    # すべてのJSONファイルからユニークなキーを取得
    columns = []
    data_list: list[dict[Any, Any]] = []
    keys_set = set()
    for json_file in json_files:
        data = _load_json_file(json_file)
        if isinstance(data, dict):
            for key in data.keys():
                if key not in keys_set:
                    keys_set.add(key)
                    columns.append(key)
            data_list.append(data)

    # CSVファイルを作成し、ヘッダーを書き込む
    with open(csv_file_name, "w", encoding="utf-8", newline="") as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(columns)

        # JSONファイルからデータを読み取り、CSVファイルに書き込む
        for data in data_list:
            row = [data.get(key, "") for key in columns]
            writer.writerow(row)

    print(f"saved csv file: {csv_file_name}")