Xenith Data Harmonizer Python GUI

👤 Sharing: AI
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import pandas as pd
import os

class DataHarmonizer:
    def __init__(self, master):
        self.master = master
        master.title("Xenith Data Harmonizer")

        self.notebook = ttk.Notebook(master)
        self.notebook.pack(pady=10, padx=10, expand=True, fill="both")

        self.tab_merge = ttk.Frame(self.notebook)
        self.tab_convert = ttk.Frame(self.notebook)
        self.tab_clean = ttk.Frame(self.notebook)

        self.notebook.add(self.tab_merge, text="Merge Data")
        self.notebook.add(self.tab_convert, text="Convert Format")
        self.notebook.add(self.tab_clean, text="Clean Data")

        self.create_merge_tab()
        self.create_convert_tab()
        self.create_clean_tab()

    def create_merge_tab(self):
        # Merge Tab Content
        ttk.Label(self.tab_merge, text="Select CSV Files to Merge:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.merge_files = []
        self.merge_listbox = tk.Listbox(self.tab_merge, height=5, width=50)
        self.merge_listbox.grid(row=1, column=0, padx=5, pady=5, sticky="w")

        ttk.Button(self.tab_merge, text="Add Files", command=self.add_merge_files).grid(row=1, column=1, padx=5, pady=5)
        ttk.Button(self.tab_merge, text="Remove Selected", command=self.remove_merge_files).grid(row=2, column=1, padx=5, pady=5)

        ttk.Label(self.tab_merge, text="Output File Name:").grid(row=3, column=0, padx=5, pady=5, sticky="w")
        self.merge_output_name = tk.Entry(self.tab_merge, width=40)
        self.merge_output_name.grid(row=3, column=1, padx=5, pady=5)

        ttk.Button(self.tab_merge, text="Merge and Save", command=self.merge_and_save).grid(row=4, column=1, padx=5, pady=5)

    def create_convert_tab(self):
        # Convert Tab Content
        ttk.Label(self.tab_convert, text="Select File to Convert:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.convert_file = tk.StringVar()
        ttk.Entry(self.tab_convert, textvariable=self.convert_file, width=40, state="disabled").grid(row=0, column=1, padx=5, pady=5)
        ttk.Button(self.tab_convert, text="Browse", command=self.browse_convert_file).grid(row=0, column=2, padx=5, pady=5)

        ttk.Label(self.tab_convert, text="Output Format:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.convert_format = ttk.Combobox(self.tab_convert, values=["CSV", "Excel", "JSON", "TXT"], state="readonly")
        self.convert_format.set("CSV")
        self.convert_format.grid(row=1, column=1, padx=5, pady=5)

        ttk.Label(self.tab_convert, text="Output File Name:").grid(row=2, column=0, padx=5, pady=5, sticky="w")
        self.convert_output_name = tk.Entry(self.tab_convert, width=40)
        self.convert_output_name.grid(row=2, column=1, padx=5, pady=5)

        ttk.Button(self.tab_convert, text="Convert and Save", command=self.convert_and_save).grid(row=3, column=1, padx=5, pady=5)

    def create_clean_tab(self):
        # Clean Tab Content
        ttk.Label(self.tab_clean, text="Select File to Clean:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.clean_file = tk.StringVar()
        ttk.Entry(self.tab_clean, textvariable=self.clean_file, width=40, state="disabled").grid(row=0, column=1, padx=5, pady=5)
        ttk.Button(self.tab_clean, text="Browse", command=self.browse_clean_file).grid(row=0, column=2, padx=5, pady=5)

        ttk.Label(self.tab_clean, text="Select Columns to Remove (comma-separated):").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.columns_to_remove = tk.Entry(self.tab_clean, width=40)
        self.columns_to_remove.grid(row=1, column=1, padx=5, pady=5)

        ttk.Label(self.tab_clean, text="Output File Name:").grid(row=2, column=0, padx=5, pady=5, sticky="w")
        self.clean_output_name = tk.Entry(self.tab_clean, width=40)
        self.clean_output_name.grid(row=2, column=1, padx=5, pady=5)

        ttk.Button(self.tab_clean, text="Clean and Save", command=self.clean_and_save).grid(row=3, column=1, padx=5, pady=5)

    def add_merge_files(self):
        files = filedialog.askopenfilenames(filetypes=[("CSV Files", "*.csv")])
        for file in files:
            if file not in self.merge_files:
                self.merge_files.append(file)
                self.merge_listbox.insert(tk.END, os.path.basename(file))

    def remove_merge_files(self):
        selected_indices = self.merge_listbox.curselection()
        for index in sorted(selected_indices, reverse=True):
            del self.merge_files[index]
            self.merge_listbox.delete(index)

    def merge_and_save(self):
        if not self.merge_files:
            messagebox.showerror("Error", "No files selected for merging.")
            return

        output_name = self.merge_output_name.get()
        if not output_name:
            messagebox.showerror("Error", "Output file name is required.")
            return

        try:
            dfs = [pd.read_csv(file) for file in self.merge_files]
            merged_df = pd.concat(dfs, ignore_index=True)
            merged_df.to_csv(output_name + ".csv", index=False)
            messagebox.showinfo("Success", "Files merged and saved successfully!")
        except Exception as e:
            messagebox.showerror("Error", f"An error occurred: {e}")

    def browse_convert_file(self):
        file = filedialog.askopenfilename()
        self.convert_file.set(file)

    def convert_and_save(self):
        file = self.convert_file.get()
        output_format = self.convert_format.get()
        output_name = self.convert_output_name.get()

        if not file:
            messagebox.showerror("Error", "No file selected for conversion.")
            return

        if not output_name:
            messagebox.showerror("Error", "Output file name is required.")
            return

        try:
            df = pd.read_csv(file)
            if output_format == "CSV":
                df.to_csv(output_name + ".csv", index=False)
            elif output_format == "Excel":
                df.to_excel(output_name + ".xlsx", index=False)
            elif output_format == "JSON":
                df.to_json(output_name + ".json", orient="records")
            elif output_format == "TXT":
                df.to_csv(output_name + ".txt", sep="\t", index=False)
            messagebox.showinfo("Success", "File converted and saved successfully!")
        except Exception as e:
            messagebox.showerror("Error", f"An error occurred: {e}")

    def browse_clean_file(self):
        file = filedialog.askopenfilename()
        self.clean_file.set(file)

    def clean_and_save(self):
        file = self.clean_file.get()
        columns_to_remove = self.columns_to_remove.get()
        output_name = self.clean_output_name.get()

        if not file:
            messagebox.showerror("Error", "No file selected for cleaning.")
            return

        if not output_name:
            messagebox.showerror("Error", "Output file name is required.")
            return

        try:
            df = pd.read_csv(file)
            columns_list = [col.strip() for col in columns_to_remove.split(',')]
            df = df.drop(columns=columns_list, errors='ignore')
            df.to_csv(output_name + ".csv", index=False)
            messagebox.showinfo("Success", "File cleaned and saved successfully!")
        except Exception as e:
            messagebox.showerror("Error", f"An error occurred: {e}")

root = tk.Tk()
app = DataHarmonizer(root)
root.mainloop()
👁️ Viewed: 7

Comments