Export Data LimeSurvey Menggunakan Python Citric

Sebenarnya saya sudah banyak membahas tentang Python Citric pada blog ini. Dan bahkan saya telah membuat skrip untuk mengambil data dari LimeSurvey dengan Python Citric dan menyimpannya dalam sqlite baik struktur maupun datanya.

Nah tadi ada kebutuhan sekedar mengambil data responses dari LimeSuryey yang barisnya melebihi 12.000 baris. Dalam database memang kalau kolomnya banyak menjadi agak berat, apalagi barisnya juga banyak.

Diambil lewat menu pada Limesurvey ternyata gagal. Mungkin karena terbentur limitasi memori pada setting PHP atau LiteSpeed, saya sendiri kurang paham, atau bisa jadi kena timeout. Namun ketika diambil menggunakan jalur API, data berhasil diambil dengan sempurna.

Oke skrip ini sangat tergantung dengan library pandas dan citric. Maka langkah pertama adalah neginstall library pandas dan citric.

pip install citric pandas

Kemudian install juga xlsx writer biar bisa nulis ke excel

pip install openpyxl

Jika sudah, kita tinggal membuka editor text copas  code dibawah ini, dan atur beberapa nilai variabelnya.

"""
Script created by Edy Santoso ([email protected])
Modified on: 2025-10-07
Purpose: Export LimeSurvey responses directly to XLSX
"""

from citric import Client
import io
import pandas as pd
import datetime

# Ganti sesuai survey kamu
SURVEY_ID = 811491

# Inisialisasi koneksi LimeSurvey
client = Client(
    'https://alamat_limesurvey_kamu/index.php/admin/remotecontrol',
    'username_kamu',
    'password_kamu'
)

# Buat nama file berdasarkan waktu sekarang
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"responses_{SURVEY_ID}_{current_time}.xlsx"

print("Downloading responses...")

# Ambil data responses dalam format CSV (lebih stabil lalu diubah ke XLSX)
with io.BytesIO() as file:
    file.write(client.export_responses(
        SURVEY_ID,
        file_format="csv",          # ambil dalam bentuk CSV dulu
        heading_type='code',        # gunakan code pertanyaan
        response_type='long',       # isi teks panjang
        completion_status='all'     # ambil semua, termasuk incomplete
    ))
    file.seek(0)

    # Baca CSV ke DataFrame pandas
    responses_df = pd.read_csv(file, delimiter=";", low_memory=False)

# Simpan ke Excel
responses_df.to_excel(output_file, index=False)
print(f"Responses saved as {output_file}")

Simpan file tersebut dan beri nama misalnya getDataXLSX.py

Nantinya kamu tinggal mausk ke folder yang bersangkutan dan jalankan dengan perintah:

python getDataXLSX.py

Tunggu beberapa saat, dan kita akan mendapatkan data dalam bentuk xlsx…

Update 2025-10-27:

Tadi ada laporan dari analis yang mencoba mendownload data, namun ada error. Setelah saya analisis karena data terlalu besar. Akhirnya saya memodifikasi skrip agar bisa download data dari id sekian ke id sekian. Nanti digabungkan sendiri

 

"""
Script created by Edy Santoso ([email protected])
Modified on: 2025-10-27
Purpose: Export LimeSurvey responses directly to XLSX
"""

from citric import Client
import io
import pandas as pd
import datetime

# Ganti sesuai survey kamu
SURVEY_ID = 811491
ID_START = 5001
ID_END = 5010

# Inisialisasi koneksi LimeSurvey
client = Client(
    'https://alamat_limesurvey_kamu/index.php/admin/remotecontrol',
    'username_kamu',
    'password_kamu'
)

# Buat nama file berdasarkan waktu sekarang
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"responses_{SURVEY_ID}_{current_time}.xlsx"

print("Downloading responses...")

# Ambil data responses dalam format CSV (lebih stabil lalu diubah ke XLSX)
with io.BytesIO() as file:
    file.write(client.export_responses(
        SURVEY_ID,
        file_format="csv",          # ambil dalam bentuk CSV dulu
        heading_type='code',        # gunakan code pertanyaan
        response_type='long',       # isi teks panjang
        completion_status='all'     # ambil semua, termasuk incomplete
        from_response_id=ID_START,  # id start
        to_response_id=ID_END       # id end 
    ))
    file.seek(0)

    # Baca CSV ke DataFrame pandas
    responses_df = pd.read_csv(file, delimiter=";", low_memory=False)

# Simpan ke Excel
responses_df.to_excel(output_file, index=False)
print(f"Responses saved as {output_file}")

Berikut parameter pada export_responses() jika ingin melakukan modifikasi output:

survey_id (int) – Survey to add the response to.
token (str | None) – Optional participant token to get responses for.
file_format (str | citric.enums.ResponsesExportFormat) – Type of export. One of PDF, CSV, XLS, DOC or JSON.
language (str | None) – Export responses made to this language version of the survey.
completion_status (str | citric.enums.SurveyCompletionStatus) – Incomplete, complete or all.
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.
from_response_id (int | None) – First response to export.
to_response_id (int | None) – Last response to export.
fields (collections.abc.Sequence[str] | None) – Which response fields to export. If none, exports all fields.
additional_options (citric.types.ExportAdditionalOptions | None) – Dictionary of additional options to format the export.

Okey demikian

Membuat PHP MVC Framework menggunakan AI

Sekarang jaman AI, tapi terus terang, baru sebulan ini serius menggunakan AI untuk coding. Sebelum-sebelumnya belum kena feelnya. Masih sebatas saya minta buat kelas dan fungsi ini itu.

Setelah saya ketemu dengan beberapa orang programmer yang mendemonstrasikan penggunaan  windsurf dan claude code, baru saya ngeh bahwa AI bisa digunakan lebih dari itu.

Pertama saya iseng minta dibuatkan aplikasi notes dan calendar sederhana dengan MVC. Hasilnya, sangat bagus. Lalu saya kepikiran untuk menyusun framework step by step. Karena ketika saya menggunakan framework yang ada sekarang, sering tidak mudah menjalankannya. Sering menjumpai error karena kesalahan setting, dan kalau eror karena frameworknya sudah kompleks maka saya sering kesulitan mencari solusinya.

Saya minta AI mengerjakan:

  • Struktur dasar MVC
  • Database Model menggunakan Illuminate/database
  • View menggunakan blade
  • Routing
  • Validation
  • Logging

Dan lain lain, yang membuat pada akhirnya malah mirip CI atau Laravel. Saya kira mungkin karena AI belajar pada code framework-framework modern, sehingga hasilnya jadi mirip-mirip.

Mengganti VGA Card

Beberapa waktu ini Slot “Display Port” saya rusak. Dugaan saya memang karena sudah aus / kelelahan. Karena komputer saya ini HP Compaq 8200 Elite SFF PC diproduksi 2012-10-23  dan garansinya berakhir  2015-12-11 . Sebuah komputer build up  second. dan saya beli 11/12/2021 seharga Rp. 1.6 juta kayaknya di bukalapak.

Jadi umurnya sudah hampir 12 tahun. Dan saya gunakan sudah hampir 4 tahun.

Komputer lama, namun bagi saya masih cukup enak digunakan untuk menjalankan windows 10. Dengan catatan HDD System harus diganti dengan SSD.

  1. Microprocessor Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
  2. System memory 8 GB

Masuh lumayan cepat untuk bekerja sehari hari dengan pekerjaan web programmer. Saya cukup puas.

Akhirnya saya ke tempat service yang jaraknya 2 km dari rumah saya. Maka saya memesan VGACard yang semula deal 300.000 akhirnya 300.000 itu ternyata second, dan saya ditawarin yg harganya 450.000.

Saya cek di Shopee harga sebenarnya 275.000. jadi ongkos pasangnya 450 ribu – 275 ribu sama dengan 175 ribu.

Jadi menurutmu ongkos pasang vga card 175 ribu mahal apa murah? Kalau saya sih, besuk pasti pasang sendiri karena sudah paham caranya 🙂

 

Manajemen Data Sederhana

Baru-baru ini saya ditunjuk sebagai sekretaris sebuah organisasi. Dan satu hal yang paling krusial adalah Data. Saya harus mempunyai basis informasi yang bisa saya akses kapanpun dan dimanapun.

Maka, kita harus mempuat aplikasi yang memenuhi kriteria sbb:

  1. Aplikasi berbasis online (yg murah menggunakan PHP)
  2. Bisa menyimpan segala bentuk file (semacam file browser)
  3. File Browser itu harus bisa setidaknya menampilkan gambar, text dan turunannya.
  4. Ada fasilitas untuk membrowse sqlite
  5. File tidak ditaruh di bawah www folder yang bisa diakses langsung dari internet.

Maka saya meminta chatGPT untuk membuatkan satu halaman index untuk login dan halaman home  sederhana. Dan menggunakan aplikasi yang sudah jadi untuk keperluan diatas dengans edikit modifikasi

  1.  Saya menggunakan https://tinyfilemanager.github.io/ untuk web file browser dengan sedikit modifikasi karena app ini tidak bisa membaca gambar yang lokasinya tidak dibawah public folder. Kedua saya memodifikasi agar tampilan csv bukan tampilan text biasa namun tampil dalam tampilan https://datatables.net/  agar bisa di short dan browse.
  2. Saya mendefinisikan lokasi sqlite dan semua data penting yang fleksibel untuk diambil informasi edit dan delete saya taruh di file sqlite yang saya akses dengan https://www.phpliteadmin.org/

Kedua aplikasi itu loginnya ganti dengan login yang saya buat lewat bantuan ChatGPT. Dengan aplikasi ini jelas, hidup saya menjadi lebih mudah.

Tinggal nanti bagaimana menyempurnakan aplikasi ini agar bisa digunakan oleh staff saya.

Beli Baterai Untuk Laptop Tua

Satu setengah tahun yang lalu anak saya diminta untuk membawa laptop ke sekolah untuk ujian. Saya yang sudah lama tidak mempunyai laptop akhirnya memilih laptop second, karena harganya miring. Apalagi ada tawaran Thinkpad.

Dengan spesifikasi Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz 2.50 GHz dengan RAM 8GB, bagi saya yang hanya seorang coder skrip, ya masih cukup lumayanlah.  Hanya 1,6 juta waktu itu.  Apalagi masih bisa diinstall Windows 10. Walaupun support Windows 10 tidak lama lagi akan habis. Arrrghhhh. Harus ganti ke Linuxkah?

Sebelum membeli Laptop ini, saya sempat bertanya ke penjualnya. baterainya aman? karena untul laptop baterai adalah kebutuhan utama. Apalagi kalau saya keluar, saya masih bisa bekerja. Aman katanya.

Ternyata tidak demikian. Baterai sudah drop. Dari kenampakannya saja terlihat bahwa baterai sudah cukup usang.

Lama tidak terpakai, dan kemarin browsing-browsing di Shopee ternyata ada yang jual dengan harga miring, hanya 170 ribu. Dengan agak berspekulasi saya belilah. Syaa katakan agak berspekulasi karena beberapa waktu sebelumnya saya beli bateray dengan harga 350 ribu tapi tidak bisa dipakai. wadeh …

Ternyata bateraynya bagus. Tertulis 4 jam untuk bateray saver on. Betulkah? Jika betul saya sungguh surprise. 2 jam saja saya sudah seneng.

Saya sengaja nekat memberi aterai walaupun sedang tak punya uang, karena sekarang saya merangkap sebagai Sekjen sebuah partai politik, yang mengharuskan saya harus keluar rumah untuk mengurus ini itu. Dan laptop tentu menjadi bagian paling penting dalam masalah ini.

Oke, begitu saja omongan saya hari ini, yang jelas keyboard laptop tua ini sangat empuuukkkk, dan jika menggunakan laptop ini saya jadi jarang typo. oke.