|
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() |