@Krzysztof_M A tu masz skrypt do zaczytywania danych z pliku CSV wygenerowanego na stronie PGE:
#!/usr/bin/env python3
import sys
import csv
from datetime import datetime
import psycopg
# ---- KONFIGURACJA BAZY ----
DB_NAME = "rachunki_prad"
DB_USER = "postgres"
DB_PASSWORD = "haslo"
DB_HOST = "localhost"
DB_PORT = "5432"
# ---- SPRAWDZENIE ARGUMENTU ----
if len(sys.argv) < 2:
print("Użycie: csv2postgres_prad.py <plik.csv>")
sys.exit(1)
csv_file = sys.argv[1]
# ---- POŁĄCZENIE Z BAZĄ ----
conn = psycopg.connect(
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD,
host=DB_HOST,
port=DB_PORT
)
cur = conn.cursor()
# ---- WSTĘPNY BUFOR NA DANE ----
data_by_date = {}
# ---- ODCZYT CSV ----
with open(csv_file, newline="", encoding="utf-8") as csvfile:
reader = csv.reader(csvfile, delimiter=";")
next(reader, None) # pomiń nagłówek
for row in reader:
if not row or len(row) < 27:
continue
data_str = row[1].strip()
typ = row[2]
# pomijamy zbilansowaną
if "En. Czynna zbilansowana" in typ:
continue
print(typ)
# konwersja daty
date_obj = datetime.strptime(data_str, "%Y%m%d").date()
# 24 wartości godzinowe
godziny = row[3:27]
values = []
for value in godziny:
value = value.strip()
if not value:
val = 0
else:
# wywalanie separatorów tysięcy
cleaned = value.replace(",", "").lstrip("0")
try:
val = int(cleaned) if cleaned else 0
except ValueError:
val = 0
values.append(val)
if date_obj not in data_by_date:
data_by_date[date_obj] = {"c": [None]*24, "p": [None]*24}
if "En.Czynna pobrana" == typ:
data_by_date[date_obj]["c"] = values
print(values)
elif "En.Czynna oddana" == typ:
data_by_date[date_obj]["p"] = values
print(values)
# ---- ZAPIS DO BAZY ----
for date_obj, vals in data_by_date.items():
cur.execute(
"""
INSERT INTO energy_usage (
date,
c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,
p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23
) VALUES (
%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,
%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s
)
ON CONFLICT (date) DO NOTHING;
""",
[date_obj] + vals["c"] + vals["p"]
)
conn.commit()
cur.close()
conn.close()
print(f"Plik '{csv_file}' został zaimportowany do bazy '{DB_NAME}'.")