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!')
Berikut penjelasan dari data diatas:
- Import Libraries: Mengimpor pustaka yang diperlukan.
- Define
remove_tags
Function: Mendefinisikan fungsi untuk menghapus tag HTML dari string.
- Current Time for Unique DB File Name: Mendapatkan waktu saat ini untuk membuat nama file database yang unik. Ini dilakukan agar nama database yang terbentuk berawalan waktu, dan tidak menimpa hasil generasi sebelumnya.
- Database Connection: Membuat koneksi ke file SQLite baru.
- Survey ID: Menetapkan ID survei (dapat diganti dengan ID yang diperlukan).
- Initialize LimeSurvey Client: Menginisialisasi klien LimeSurvey dengan URL dan kredensial yang diperlukan. Atau dengan kata mudahnya, koneksi ke LimeSurvey API.
- Get Field Map: Mengambil “fields map”
- Build Question Data: Mengiterasi melalui “field map” untuk membangun data pertanyaan dan menambahkannya ke dalam daftar.
- Create DataFrame: Membuat DataFrame dari daftar data pertanyaan.
- Insert Questions DataFrame into SQLite: Memasukkan DataFrame pertanyaan ke dalam tabel SQLite.
- Export Responses and Load into DataFrame: Mengekspor respons dari LimeSurvey dan memuatnya ke dalam DataFrame.
- Insert Responses DataFrame into SQLite: Memasukkan DataFrame respons ke dalam tabel SQLite.
- Done: Mencetak pesan selesai.
Dengan format data seperti ini analisa data akan lebih mudah dilakukan,