diff --git a/earthquakes.py b/earthquakes.py index 4dc80f4..95def72 100644 --- a/earthquakes.py +++ b/earthquakes.py @@ -1,7 +1,6 @@ #! /usr/bin/env python # pyright: basic -import json import os import pandas as pd @@ -18,6 +17,7 @@ MENU ="""[1] Criar a base de dados [6] Guardar como JSON [7] Guardar como CSV [8] Estatísticas +[9] Atualizar uma entrada de um evento [Q] Sair """ @@ -35,7 +35,7 @@ def guardar_df(df: pd.DataFrame, fname: str) -> bool: def guardar_json(df: pd.DataFrame, fname: str) -> bool: with open(fname , "w") as fp: try: - json.dump(df.to_json(), fp) + df.to_json(fp) except: return False return True @@ -67,7 +67,10 @@ def main(): if fname is None: fname = "dados.txt" - if _file_exists(fname): + if _file_exists(fname) and fname.endswith(".json"): + db = pd.read_json(fname) + print("Base de dados populada.") + elif _file_exists(fname): db = parser.parse(fname) input("Base de dados populada. Enter para voltar ao menu inicial") else: @@ -104,9 +107,17 @@ def main(): retInfo = "ID do event não encontrado!" else: + os.system("cls") table = crud.get_table(db, eid_choice) + _prettify_event(table) crud.show_table(table) row_choice = _get_usr_input("Escolhe a linha a apagar:", int) + # TODO: balizar a escolha para apenas as linhas do evento em questao + row_choice = _get_usr_input("Escolhe a linha a apagar:", int) + + + # TODO: balizar a escolha para apenas as linhas do evento em questao + row_choice = _get_usr_input("Escolhe a linha a apagar: ", int) db = crud.delete_table_row(db, eid_choice, row_choice) new_table = crud.get_table(db, eid_choice) crud.show_table(new_table) @@ -134,7 +145,7 @@ def main(): case "6": if db is not None: - fname = _get_usr_input("Nome do ficheiro a guardar?") + fname = _get_usr_input("Nome do ficheiro a guardar? ") if fname is None: fname = "valores.json" guardar_json(db, fname) @@ -143,7 +154,7 @@ def main(): case "7": if db is not None: - fname = _get_usr_input("Nome do ficheiro a guardar?") + fname = _get_usr_input("Nome do ficheiro a guardar? ") if fname is None: fname = "valores.csv" guardar_csv(db, fname) @@ -156,6 +167,25 @@ def main(): else: retInfo = "Base de dados não encontrada!" + case "9": + if db is not None: + crud.read_ids(db) + eid_choice = _get_usr_input("Escolhe o ID: ", int) + + if not _event_exists(db, eid_choice): + retInfo = "ID do event não encontrado!" + + else: + table = crud.get_table(db, eid_choice) + crud.show_table(table) + row_choice = _get_usr_input("Escolhe a linha a atualizar: ", int) + new_data = {} + for col in crud.TABLE_READ_RET: + val = _get_usr_input(f"Novo valor para {col} (Enter para manter o valor atual): ") + if val is not None: + new_data[col] = val + crud.update_table_row(db, row_choice, new_data) + case "q": isRunning = False continue @@ -189,6 +219,15 @@ def _get_usr_input(msg:str, asType=str): def _prettify_event(df): preambleInfo = df.drop_duplicates(subset="ID", keep="first") stations = df[["Estacao", "Componente", "Tipo Onda", "Amplitude"]] + info = df.drop_duplicates(subset="Data", keep="first") + stations = df[["Estacao", "Componente", "Tipo Onda", "Amplitude"]] + data = datetime.fromisoformat(info.Data.values[0]).strftime("%c") + print(f"Região: {info["Regiao"].values[0]}\nData: {data}\nLatitude: {info.Lat.values[0]}\nLongitude: {info.Long.values[0]}" + + f"\nProfundidade: {info.Prof.values[0]}\nTipo de evento: {info['Tipo Ev'].values[0]}\n") + info = df.drop_duplicates(subset="Data", keep="first") + data = datetime.fromisoformat(info.Data.values[0]).strftime("%c") + print(f"Região: {info["Regiao"].values[0]}\nData: {data}\nLatitude: {info.Lat.values[0]}\nLongitude: {info.Long.values[0]}" + + f"\nProfundidade: {info.Prof.values[0]}\nTipo de evento: {info['Tipo Ev'].values[0]}\n") if __name__ == '__main__': main() diff --git a/utils/crud.py b/utils/crud.py index 1cbe84a..0dcfc4e 100644 --- a/utils/crud.py +++ b/utils/crud.py @@ -61,16 +61,11 @@ def read_table_row(df, event_id, row_number_1): info.append(f"{i+1} {col}: {row[col]}") return f"Linha {row_number_1:02d} do evento {event_id}:\n" + "\n".join(info) -def update_table_row(df, event_id, row_number_1, new_data): - # atualiza uma linha específica da tabela do evento - row_number_0 = row_number_1 - 1 - table = get_table(df, event_id) - if row_number_0 < 0 or row_number_0 >= len(table): - return f"Linha {row_number_1} não pertence ao evento {event_id}." +def update_table_row(df, row_line, new_data): for key, value in new_data.items(): - if key in table.columns: - df.loc[(df["ID"] == event_id) & (df.index == table.index[row_number_0]), key] = value - return f"Linha {row_number_1} do evento {event_id} atualizada com sucesso." + if key in df.columns: + df.loc[row_line, key] = value + return f"Linha {row_line} do evento atualizada com sucesso." def update_header(df, event_id, new_data): # atualiza o header de um evento