Data Preparation: Konversi Limesurvey Data dan Pertanyaan ke SQLite dengan Python Citric
Ini adalah skrip untuk mengambil data hasil survey dan pertanyaan dan mengkonversinya ke dalam sqlite dengan harapan data akan lebih mudah diolah kembali. SQLite sengaja saya pilih agar data bisa diolah langsung dengan SQL dan apabila perlu, hasil olahan bisa disimpan dalam view. Atau, jika menginginkan diolah menggunakan dataframe maka data yang ada dalam sqlite bisa di load dengan mudah.
Hasil dari skrip Python ini adalah
- Data pertanyaan yang lengkap berupa kode pertanyaan, pertanyaan, dan kode field dalam database. Lengkap.
- Data hasil survey dengan long answer dengan nama field kode pertanyaan. Tapi kamu bisa mengubahnya sendiri jika menginginkan hal yang berbeda.
Saya mengunakan Library Citric pada python dengan dokumentasi disini dan Chat GPT untuk merapikan skripnya.
Ok silahkan …
""" Script created by Edy Santoso ([email protected]) Created on: 2024-08-02 """ from citric import Client import io import pandas as pd import sqlite3 import datetime import re def remove_tags(raw_html): """Remove HTML tags from a string""" cleantext = re.sub(re.compile('<.*?>'), '', raw_html) return cleantext # Get the current time for unique database file naming current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S") db_file = f"{current_time}_survey.sqlite3" conn = sqlite3.connect(db_file) # Replace with your survey ID survey_id = 868964 # Initialize the LimeSurvey client client = Client( 'http://limesurvey6.test/index.php/admin/remotecontrol', 'admin', 'adminpassword' ) # Get field map for the survey fieldsmap = client.get_fieldmap(survey_id) qs = [] for key, field in fieldsmap.items(): code = "" # Build the code from title, aid, and scale_id if field['title'] != '': code += field['title'] if field['aid'] != '': code += f"[{field['aid']}]" scale_id = field.get('scale_id') if scale_id is not None: code += f"[{scale_id}]" # Get subquestion if it exists subquestion = field.get('subquestion') if subquestion is not None: subquestion = f"[{subquestion}]" else: subquestion = "" # Append the field data to the list qs.append([ field['gid'], field['qid'], field['fieldname'], field['type'], code, field['group_name'], remove_tags(field['question']), subquestion ]) # Create DataFrame from the list of field data df = pd.DataFrame(qs, columns=['gid', 'qid', 'field_name', 'type', 'code', 'group_name', 'question', 'subquestion']) print('wait...') # Insert DataFrame into SQLite database questions_table = 'questions' df.to_sql(questions_table, conn, if_exists='replace', index=False) print(f"{questions_table} table created") # Export responses from LimeSurvey and load into DataFrame responses_table = 'responses' with io.BytesIO() as file: # heading_type (str | citric.enums.HeadingType) – Use response codes, long or abbreviated titles. # response_type (str | citric.enums.ResponseType) – Export long or short text responses. # completion_status (str | citric.enums.SurveyCompletionStatus) – Incomplete, complete or all. file.write(client.export_responses(survey_id, file_format="csv", heading_type='code', response_type='long')) file.seek(0) responses_df = pd.read_csv( file, delimiter=";", parse_dates=["datestamp", "startdate", "submitdate"], index_col="id", ) # Insert responses DataFrame into SQLite database responses_df.to_sql(responses_table, conn, if_exists='replace', index=False) print(f"{responses_table} table created") print('Done!')