| import streamlit as st |
| import pandas as pd |
| import json |
| import io |
| import math |
|
|
| |
| def load_ifs_file(file): |
| try: |
| return json.load(file), None |
| except Exception as e: |
| return None, str(e) |
|
|
| |
| def extract_values(json_data, code_neo_list): |
| extracted_values = [] |
| for code in code_neo_list: |
| try: |
| |
| value = json_data.get("data", {}).get("modules", {}).get("food_8", {}).get("questions", {}) |
| keys = code.replace("data_modules_food_8_questions_", "").split("_") |
| for key in keys: |
| if isinstance(value, list): |
| value = value[0] if len(value) > 0 else None |
| if isinstance(value, dict): |
| value = value.get(key, None) |
| |
| if isinstance(value, dict): |
| value = value.get("answer", None) |
| extracted_values.append(value) |
| except (KeyError, TypeError, IndexError): |
| extracted_values.append(None) |
| return extracted_values |
|
|
| |
| def update_json_safe(json_data, code_neo_list, new_values): |
| for code, new_value in zip(code_neo_list, new_values): |
| try: |
| |
| if new_value is None or (isinstance(new_value, float) and math.isnan(new_value)): |
| continue |
| |
| |
| value = json_data.get("data", {}).get("modules", {}).get("food_8", {}).get("questions", {}) |
| keys = code.replace("data_modules_food_8_questions_", "").split("_") |
| for key in keys[:-1]: |
| if isinstance(value, list): |
| value = value[0] if len(value) > 0 else None |
| if isinstance(value, dict): |
| value = value.get(key, None) |
| |
| if isinstance(value, dict): |
| value["answer"] = new_value |
| except (KeyError, TypeError, IndexError): |
| pass |
| return json_data |
|
|
| |
| st.title("JSON to Excel Mapping and Update") |
|
|
| |
| mode = st.sidebar.radio("Select Mode", ["Extraction Mode", "Update Mode"]) |
|
|
| if mode == "Extraction Mode": |
| st.header("Extraction Mode") |
| |
| |
| uploaded_json_file = st.file_uploader("Upload .ifs File", type=["ifs"]) |
| |
| uploaded_excel_template = st.file_uploader("Upload Excel Template", type=["xls", "xlsx"]) |
| |
| if uploaded_json_file and uploaded_excel_template: |
| |
| json_data, json_error = load_ifs_file(uploaded_json_file) |
| if json_error: |
| st.error(f"Error loading JSON: {json_error}") |
| else: |
| |
| template_df = pd.read_excel(uploaded_excel_template, sheet_name="profil") |
| code_neo_list = template_df["CODE_NEO"].tolist() |
| |
| |
| extracted_values = extract_values(json_data, code_neo_list) |
| template_df["TEXTE_NEO"] = extracted_values |
| |
| |
| output = io.BytesIO() |
| with pd.ExcelWriter(output, engine="openpyxl") as writer: |
| template_df.to_excel(writer, index=False, sheet_name="profil") |
| output.seek(0) |
| |
| |
| st.success("Data extracted successfully!") |
| st.download_button( |
| label="Download Extracted Excel", |
| data=output, |
| file_name="extracted_data.xlsx", |
| mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| ) |
|
|
| elif mode == "Update Mode": |
| st.header("Update Mode") |
| |
| |
| uploaded_json_file = st.file_uploader("Upload Original .ifs File", type=["ifs"]) |
| |
| uploaded_updated_excel = st.file_uploader("Upload Updated Excel File", type=["xls", "xlsx"]) |
| |
| if uploaded_json_file and uploaded_updated_excel: |
| |
| json_data, json_error = load_ifs_file(uploaded_json_file) |
| if json_error: |
| st.error(f"Error loading JSON: {json_error}") |
| else: |
| |
| updated_df = pd.read_excel(uploaded_updated_excel, sheet_name="profil") |
| code_neo_list = updated_df["CODE_NEO"].tolist() |
| updated_values = updated_df["TEXTE_NEO"].tolist() |
| |
| |
| updated_json_data = update_json_safe(json_data, code_neo_list, updated_values) |
| |
| |
| updated_json_str = json.dumps(updated_json_data, indent=4) |
| st.success("JSON updated successfully!") |
| st.download_button( |
| label="Download Updated .ifs File", |
| data=updated_json_str, |
| file_name="updated_report.ifs", |
| mime="application/json" |
| ) |
|
|
|
|
|
|