diff --git a/crud.py b/crud.py index 5036ebd..66ee24a 100644 --- a/crud.py +++ b/crud.py @@ -1,5 +1,6 @@ import pandas as pd import parser +import earthquakes as eq pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) @@ -20,7 +21,7 @@ def read_header(df, event_id): info = [] for (i, col) in enumerate(headerCols): info.append(f"{i+1} {col}: {row[col]}") - infoString = f"Event {event_id} header:\n" + "\n".join(info) + infoString = f"Header do evento {event_id}:\n" + "\n".join(info) return infoString @@ -32,12 +33,13 @@ def get_table(df, event_id): table = rows[cols[start:]].iloc[1:] return table -def read_table_row(df, event_id, row_number): +def read_table_row(df, event_id, row_number_1): # retorna uma linha específica da tabela + row_number_0 = row_number_1 - 1 table = get_table(df, event_id) - if row_number < 0 or row_number >= len(table): - return f"Linha {row_number} não pertence ao evento {event_id}." - row = table.iloc[row_number] + if row_number_0 < 0 or row_number_0 >= len(table): + return f"Linha {row_number_1} não pertence ao evento {event_id}." + row = table.iloc[row_number_0] cols = list(df.columns) start = cols.index("STAT") tableCols = cols[start:] @@ -45,18 +47,90 @@ def read_table_row(df, event_id, row_number): for (i, col) in enumerate(tableCols): info.append(f"{i+1} {col}: {row[col]}") # TODO corrigir numeros acima de 10 arruinando o alinhamento - infoString = f"Event {event_id}, row {row_number} header:\n" + "\n".join(info) + infoString = f"Linha {row_number_1} do evento {event_id}:\n" + "\n".join(info) return infoString +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}." + 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." -# teste temporário enquanto não temnos menu +def update_header(df, event_id, new_data): + # atualiza o header de um evento + for key, value in new_data.items(): + if key in df.columns: + df.loc[(df["ID"] == event_id) | df.iloc[0], key] = value + return f"Header do evento {event_id} atualizado com sucesso." + +def delete_event(df, event_id): + # Apaga um evento inteiro (header + tabela) + new_df = df.drop(df[df["ID"] == event_id].index) + new_df.loc[df["ID"] > event_id, "ID"] -= 1 + return new_df + +def delete_table_row(df, event_id, row_number_1): + # Apaga 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}." + new_df = df.drop(table.index[row_number_0]) + return new_df + +def create_blank_event(df, event_id): + # Criar um evento vazio com linha de header e 1 linha de coluna + df.loc[df["ID"] >= event_id, "ID"] += 1 + + blank_row_df = pd.DataFrame(columns=df.columns, index=[0, 1]) + blank_row_df["ID"] = event_id + blank_row_df = blank_row_df.astype(df.dtypes) + + new_df = pd.concat([df, blank_row_df], ignore_index=True) + new_df = new_df.sort_values(by="ID", kind="mergesort").reset_index(drop=True) + + return new_df + + +def create_table_row(df, event_id, row_number_1): + event_rows = df[df["ID"] == event_id] + if event_rows.empty: + return df, f"Erro: Evento com ID {event_id} não encontrado." + + header_idx = event_rows.index[0] + table_size = len(event_rows.index) - 1 + + # Validar posição da nova linha + if not (1 <= row_number_1 <= table_size + 1): + return df, f"Erro: Posição {row_number_1} inválida. Evento {event_id} tem {table_size} linha(s) na tabela." + insertion_point = header_idx + row_number_1 + + new_row_df = pd.DataFrame(columns=df.columns, index=[0]) + new_row_df['ID'] = event_id + new_row_df = new_row_df.astype(df.dtypes) + df_before = df.iloc[:insertion_point] + df_after = df.iloc[insertion_point:] + + new_df = pd.concat([df_before, new_row_df, df_after], ignore_index=True) + + return new_df, f"Linha inserida com sucesso na posição {row_number_1} do evento {event_id}." + +''' teste temporário enquanto não temnos menu if __name__ == "__main__": df = parser.parse() first_id = read_ids(df)[0] - print(read_ids(df)) - print("\n") - print(read_header(df, first_id)) - print("\n") - print(get_table(df, first_id)) - print("\n") - print(read_table_row(df, first_id, 2)) + for i in range(5): + df = delete_event(df, i) + for i in range(5): + df = create_blank_event(df, i+5) + update_table_row(df, 5, 1, {"Velo": 5.1}) + df, msg = insert_table_row(df, 5, 1) + df, msg = insert_table_row(df, 5, 3) + eq.guardar_csv(df, "dados.csv") + eq.guardar_df(df, "data.txt") +''' \ No newline at end of file diff --git a/earthquakes.py b/earthquakes.py index be20fa8..73a1611 100644 --- a/earthquakes.py +++ b/earthquakes.py @@ -20,6 +20,13 @@ def guardar_json(df: pd.DataFrame, fname: str) -> bool: return False return True +def guardar_csv(df: pd.DataFrame, fname: str): + with open(fname, "w") as fp: + try: + df.to_csv(fp, index=False) + except ValueError: + return False + return True def main(): pass diff --git a/requirements.txt b/requirements.txt index ef9805b..e7f650b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ pytest==8.4.2 +pandas==2.3.3 \ No newline at end of file