File size: 3,955 Bytes
84ccc62
 
dacee8e
 
84ccc62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41c0212
21712df
008c795
84ccc62
 
 
 
 
dacee8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84ccc62
dacee8e
f22cfa6
84ccc62
 
 
 
dacee8e
 
 
 
 
 
 
 
 
 
 
 
 
 
f22cfa6
 
dacee8e
 
84ccc62
dacee8e
 
84ccc62
dacee8e
84ccc62
 
 
 
 
 
 
 
 
 
 
 
 
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pandas as pd
import re
import os
from sqlalchemy import create_engine, inspect, Table, MetaData, Column, Integer, String, text
import psycopg2

# チャット履歴ファイルを読み込む関数(最初の3行をスキップ)
def load_chat_history(file_path):
    return pd.read_csv(file_path, skiprows=3)

# 個人情報をマスクする関数
def mask_personal_info(text):
    # 電話番号のマスク
    text = re.sub(r'\b\d{2,4}-\d{2,4}-\d{4}\b', '[電話番号]', text)
    
    # メールアドレスのマスク
    text = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '[メールアドレス]', text)
    
    # 名前のマスク(例として"えみいわし"をマスク)
    names = ['えみいわし']
    for name in names:
        text = re.sub(r'\b' + name + r'\b', '[名前]', text)
    
    return text

# データフレームの特定の列の個人情報をマスクする関数
def mask_specific_columns(df, columns):
    for column in columns:
        df[column] = df[column].astype(str).apply(mask_personal_info)
    return df

# データベースに接続する関数
def connect_to_db():
    conn = psycopg2.connect(
        dbname="neondb",
        user=os.getenv("postgre_user"),
        password=os.getenv("postgre_pass"),
        host=os.getenv("postgre_host"),
        port=5432,
        sslmode="require"
    )
    return conn

# フォルダー内のすべてのCSVファイルを処理し、PostgreSQLにインポートする関数
def process_and_import_csv_folder(folder_path, engine):
    # フォルダー内のすべてのCSVファイルを取得
    csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
    
    for csv_file in csv_files:
        file_path = os.path.join(folder_path, csv_file)
        
        # チャット履歴を読み込み、特定の列の個人情報をマスク
        chat_history_df = load_chat_history(file_path)
        columns_to_mask = ['送信者タイプ', '送信者名', '送信日', '送信時刻', '内容']
        masked_chat_history_df = mask_specific_columns(chat_history_df, columns_to_mask)
        
        # マスクされたデータをPostgreSQLにインポート
        masked_chat_history_df.to_sql('fasis_chat_history', engine, if_exists='append', index=False)

# ファイルパスの設定
folder_path = '/home/user/app/polls/databases'  # CSVファイルが格納されているフォルダーのパス

# データベースの接続設定
engine = create_engine('postgresql+psycopg2://miyataken999:yz1wPf4KrWTm@ep-odd-mode-93794521.us-east-2.aws.neon.tech:5432/neondb')

# テーブルを再作成
metadata = MetaData()

if inspect(engine).has_table("fasis_chat_history"):
    table = Table('fasis_chat_history', metadata, autoload_with=engine)
    table.drop(engine)

table = Table('fasis_chat_history', metadata,
              Column('id', Integer, primary_key=True, autoincrement=True),
              Column('送信者タイプ', String),
              Column('送信者名', String),
              Column('送信日', String),
              Column('送信時刻', String),
              Column('内容', String),
              Column('AnswerField', String),
              extend_existing=True)

metadata.create_all(engine)

# フォルダー内のすべてのCSVファイルを処理し、PostgreSQLにインポート
process_and_import_csv_folder(folder_path, engine)

print("すべてのCSVファイルのデータインポートが完了しました。")

# データベースに接続してクエリを実行する関数
def execute_query(query, engine):
    with engine.connect() as connection:
        result = connection.execute(text(query))
        return result.fetchall()

# クエリの例: マスクされたデータを取得
query = "SELECT * FROM fasis_chat_history LIMIT 10;"
results = execute_query(query, engine)

# クエリ結果を表示
for row in results:
    print(row)