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