| import gradio as gr |
| import pandas as pd |
| import os |
| import tempfile |
| import chardet |
|
|
| def detect_encoding(file_path): |
| """ |
| Function to detect file encoding |
| """ |
| with open(file_path, 'rb') as f: |
| result = chardet.detect(f.read()) |
| return result['encoding'] |
|
|
| def merge_csv_files(files): |
| """ |
| Function to merge multiple CSV files into one |
| |
| Args: |
| files: List of uploaded CSV files |
| |
| Returns: |
| Path to the merged CSV file and status message |
| """ |
| if not files or len(files) == 0: |
| return None, "No files were uploaded. Please select CSV files to merge." |
| |
| if len(files) > 30: |
| return None, "Maximum 30 files can be merged at once." |
| |
| try: |
| |
| dataframes = [] |
| for file in files: |
| |
| encoding = detect_encoding(file.name) |
| try: |
| df = pd.read_csv(file.name, encoding=encoding) |
| except UnicodeDecodeError: |
| |
| encodings_to_try = ['cp949', 'euc-kr', 'latin1', 'ISO-8859-1'] |
| for enc in encodings_to_try: |
| try: |
| df = pd.read_csv(file.name, encoding=enc) |
| break |
| except UnicodeDecodeError: |
| continue |
| else: |
| return None, f"Could not determine encoding for '{os.path.basename(file.name)}'." |
| |
| dataframes.append(df) |
| |
| |
| if dataframes: |
| merged_df = pd.concat(dataframes, ignore_index=True) |
| |
| |
| with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp: |
| output_path = tmp.name |
| |
| |
| merged_df.to_csv(output_path, index=False, encoding='utf-8-sig') |
| |
| return output_path, f"Successfully merged {len(files)} files. Please open with UTF-8 encoding in Excel." |
| else: |
| return None, "No data to merge." |
| |
| except Exception as e: |
| return None, f"Error occurred: {str(e)}" |
|
|
| |
| with gr.Blocks(title="CSVFusion") as app: |
| gr.Markdown( |
| """ |
| # 📊 CSVFusion: Intelligent File Merger |
| |
| *Seamlessly combine multiple CSV files into one unified dataset* |
| |
| --- |
| """ |
| ) |
| |
| with gr.Row(): |
| with gr.Column(scale=2): |
| gr.Markdown(""" |
| ### How to use CSVFusion: |
| 1. Upload up to 30 CSV files using the panel on the right |
| 2. Click the "Merge Files" button |
| 3. Download your consolidated CSV file |
| |
| ### Features: |
| - Automatic encoding detection |
| - Handles various CSV formats |
| - Excel-compatible output (UTF-8) |
| - Preserves all data columns |
| """) |
| |
| with gr.Column(scale=3): |
| input_files = gr.File( |
| file_count="multiple", |
| label="Upload CSV Files (Max 30)", |
| file_types=[".csv"], |
| elem_id="file_upload" |
| ) |
| |
| with gr.Row(): |
| merge_button = gr.Button("Merge Files", variant="primary", size="lg") |
| |
| with gr.Row(): |
| with gr.Column(): |
| status = gr.Textbox(label="Status", placeholder="Ready to merge your files...") |
| with gr.Column(): |
| output_file = gr.File(label="Download Merged CSV") |
| |
| |
| gr.HTML(""" |
| <style> |
| .gradio-container { |
| background: linear-gradient(to right, #f9f9f9, #ffffff); |
| border-radius: 12px; |
| } |
| #file_upload { |
| border: 2px dashed #3498db; |
| border-radius: 8px; |
| padding: 20px; |
| transition: all 0.3s; |
| } |
| #file_upload:hover { |
| border-color: #2980b9; |
| box-shadow: 0 0 10px rgba(52, 152, 219, 0.3); |
| } |
| .footer { |
| text-align: center; |
| margin-top: 30px; |
| color: #7f8c8d; |
| font-size: 0.9em; |
| } |
| </style> |
| """) |
| |
| |
| gr.HTML(""" |
| <div class="footer"> |
| <p>CSVFusion © 2025 - A powerful tool for data professionals</p> |
| </div> |
| """) |
| |
| merge_button.click( |
| fn=merge_csv_files, |
| inputs=[input_files], |
| outputs=[output_file, status] |
| ) |
|
|
| |
| if __name__ == "__main__": |
| app.launch() |