File size: 3,538 Bytes
d2b9031
49e25d2
ff86828
d2b9031
6a1564b
 
 
 
0df8fba
4f2568a
 
 
 
 
 
 
 
 
 
 
6a1564b
 
 
 
0df8fba
6a1564b
 
 
 
 
 
2bf1e25
6a1564b
 
 
 
 
 
 
0df8fba
6a1564b
 
 
0df8fba
6a1564b
2bf1e25
90f89f0
6a1564b
90f89f0
 
 
 
7773ef1
31c7995
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72dd3ca
31c7995
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import gradio as gr
import pandas as pd
from io import BytesIO

def convert_file(input_file, conversion_type):
    # Check if a file was uploaded
    if input_file is None:
        raise ValueError("Please upload a file.")

    # Determine if input_file is a file-like object or a file path string.
    try:
        # Try reading from file-like object
        file_bytes = input_file.read()
        file_name = input_file.name
    except AttributeError:
        # If there's an AttributeError, treat input_file as a file path.
        file_name = input_file
        with open(file_name, "rb") as f:
            file_bytes = f.read()
    
    file_extension = file_name.lower().split('.')[-1]
    df = None
    output_file = None
    converted_format = None

    # Conversion: CSV to Parquet
    if conversion_type == "CSV to Parquet":
        if file_extension != "csv":
            raise ValueError("For CSV to Parquet conversion, please upload a CSV file.")
        df = pd.read_csv(BytesIO(file_bytes))
        output_file = "output.parquet"
        df.to_parquet(output_file, index=False)
        converted_format = "Parquet"
    # Conversion: Parquet to CSV
    elif conversion_type == "Parquet to CSV":
        if file_extension != "parquet":
            raise ValueError("For Parquet to CSV conversion, please upload a Parquet file.")
        df = pd.read_parquet(BytesIO(file_bytes))
        output_file = "output.csv"
        df.to_csv(output_file, index=False)
        converted_format = "CSV"
    else:
        raise ValueError("Invalid conversion type selected.")

    # Generate a preview of the top 10 rows
    preview = df.head(10).to_string(index=False)
    info_message = (
        f"Input file: {file_name}\n"
        f"Converted file format: {converted_format}\n\n"
        f"Preview (Top 10 Rows):\n{preview}"
    )
    return output_file, info_message

# Custom CSS for a modern and sleek look
custom_css = """
body {
    background-color: #f4f4f4;
    font-family: 'Helvetica Neue', Arial, sans-serif;
}
.gradio-container {
    max-width: 900px;
    margin: 40px auto;
    padding: 20px;
    background-color: #ffffff;
    border-radius: 12px;
    box-shadow: 0 8px 16px rgba(0,0,0,0.1);
}
h1, h2 {
    color: #333333;
}
.gradio-input, .gradio-output {
    margin-bottom: 20px;
}
.gradio-button {
    background-color: #4CAF50 !important;
    color: white !important;
    border: none !important;
    padding: 10px 20px !important;
    font-size: 16px !important;
    border-radius: 6px !important;
    cursor: pointer;
}
.gradio-button:hover {
    background-color: #45a049 !important;
}
"""

with gr.Blocks(css=custom_css, title="CSV <-> Parquet Converter") as demo:
    gr.Markdown("# CSV <-> Parquet Converter")
    gr.Markdown("Upload a CSV or Parquet file and select the conversion type. The app converts the file to the opposite format and displays a preview of the top 10 rows.")
    
    with gr.Row():
        with gr.Column(scale=1):
            input_file = gr.File(label="Upload CSV or Parquet File")
        with gr.Column(scale=1):
            conversion_type = gr.Radio(choices=["CSV to Parquet", "Parquet to CSV"], label="Conversion Type")
    
    convert_button = gr.Button("Convert", elem_classes=["gradio-button"])
    
    with gr.Row():
        output_file = gr.File(label="Converted File")
        preview = gr.Textbox(label="Preview (Top 10 Rows)", lines=15)
    
    convert_button.click(fn=convert_file, inputs=[input_file, conversion_type], outputs=[output_file, preview])

demo.launch()