Skip to content

Commit dee43a0

Browse files
authored
New app.py
Final Version
1 parent 887e6b4 commit dee43a0

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

app.py

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import streamlit as st
2+
import pandas as pd
3+
from functools import reduce
4+
from collections import Counter
5+
from io import BytesIO
6+
7+
st.header('Spreadsheet Query UI')
8+
9+
# Initialize the session state
10+
if 'uploaded_files' not in st.session_state:
11+
st.session_state['uploaded_files'] = {}
12+
13+
# Use st.expander for file management section
14+
with st.expander('File Management'):
15+
uploaded_file = st.file_uploader("Choose an Excel file", type=['xls', 'xlsx', 'xlsm', 'xlsb'])
16+
17+
if uploaded_file is not None:
18+
xls = pd.ExcelFile(BytesIO(uploaded_file.read()))
19+
filepaths = {uploaded_file.name: xls}
20+
st.session_state['uploaded_files'].update(filepaths)
21+
22+
if st.session_state['uploaded_files']:
23+
remove_file = st.selectbox('Select a file to remove', list(st.session_state['uploaded_files']))
24+
if st.button('Remove File'):
25+
st.session_state['uploaded_files'].pop(remove_file)
26+
27+
data = {}
28+
original_column_names = {}
29+
30+
for path, xls in st.session_state['uploaded_files'].items():
31+
for sheet_name in xls.sheet_names:
32+
df = xls.parse(sheet_name, dtype=str)
33+
original_column_names.update({col.lower().replace(' ', '_').replace(r'\W', ''): col for col in df.columns})
34+
df.columns = df.columns.str.replace(' ', '_').str.replace(r'\W', '').str.lower()
35+
data[f'{path}_{sheet_name}'] = df
36+
37+
column_names = [col for df in data.values() for col in df.columns]
38+
counter = Counter(column_names)
39+
common_columns = [name for name, count in counter.items() if count > 2]
40+
rare_columns = [name for name, count in counter.items() if count == 2]
41+
unique_columns = [name for name, count in counter.items() if count == 1]
42+
43+
st.subheader('Pick Terms to Search For')
44+
st.markdown('### Common Fields')
45+
selected_common_columns = [column for column in common_columns if st.checkbox(original_column_names.get(column, column), key=f'common_{column}')]
46+
47+
with st.expander("Rare Fields"):
48+
selected_rare_columns = [column for column in rare_columns if st.checkbox(original_column_names.get(column, column), key=f'rare_{column}')]
49+
50+
with st.expander("Unique Fields"):
51+
selected_unique_columns = [column for column in unique_columns if st.checkbox(original_column_names.get(column, column), key=f'unique_{column}')]
52+
53+
selected_columns = selected_common_columns + selected_rare_columns + selected_unique_columns
54+
selected_values = {}
55+
for column in selected_columns:
56+
options = list(set(str(val) for df in data.values() if column in df.columns for val in df[column].dropna().unique()))
57+
selected_values[column] = st.selectbox(f"{original_column_names.get(column, column)} values", options, key=f'selectbox_{column}')
58+
59+
logical_operator = st.selectbox("Logical Operator", options=["And", "Or"], index=0)
60+
view_all_columns = st.checkbox('View all columns in results')
61+
62+
if st.button("🔍 Search 🔎"):
63+
results = []
64+
for name, df in data.items():
65+
conditions = [df[column] == selected_values[column] for column in selected_values if column in df.columns]
66+
if conditions:
67+
matched_df = df[reduce(lambda a, b: a | b, conditions) if logical_operator == "Or" else reduce(lambda a, b: a & b, conditions)]
68+
if not matched_df.empty:
69+
results.append({'name': name, 'data': matched_df})
70+
71+
if results:
72+
st.subheader('Global Search Results')
73+
for result in results:
74+
st.markdown(f'### {result["name"]}')
75+
st.dataframe(result['data'] if view_all_columns else result['data'].iloc[:, :3])
76+
else:
77+
st.write('No results found')

0 commit comments

Comments
 (0)