Dan Musinguzi Nabaasa 2026
Status: V4 extraction running (30/54 files complete - 56%)
Location: processed_v4/ folder
Expected completion: Shortly
Purpose: Add missing voters or edit existing voter records
python manual_voter_manager.py-
Add New Voter (Interactive)
- Enter voter details step-by-step
- Automatic age calculation from DOB
- Prevents duplicates
- Auto-saves to correct polling station CSV
-
Search for Voter
- Find voters by name (fuzzy search)
- View complete voter information
- Check if someone is in the register
-
View Statistics
- Total voters count
- Gender breakdown
- Voters per polling station
$ python manual_voter_manager.py
1. Add new voter (interactive)
Full Name: DAN MUSINGUZI NABAASA
Gender: M
Date of Birth: 15-03-1990
Village: BUTARE
Polling Station: AMIIZI MARUNGI CENTRE
Parish: RUTOOMA
Division: KABALE NORTHERN
✓ Voter added successfully!
2. Search for voter
Enter name: NABAASA
Found 1 match:
1. DAN MUSINGUZI NABAASA
DOB: 15-03-1990 | Age: 35 | Gender: M
Village: BUTARE | Station: AMIIZI MARUNGI CENTRE
Purpose: Match contact lists (phone numbers, emails) with verified voters
Contacts/
├── Matched/ ← Successfully matched contacts
├── Unmatched/ ← Contacts not found in voter register
└── Logs/ ← Matching history and statistics
# Basic usage
python contact_matcher_v2.py <file> <name_column> [phone_column] [email_column]
# Examples
python contact_matcher_v2.py contacts.csv Name Phone Email
python contact_matcher_v2.py "DNM Master Contact Database.xlsx" full_name mobile
# Scan for contact files in directory
python contact_matcher_v2.py --scan- Loads your contact file (CSV or Excel)
- Matches each contact against verified voters using:
- Exact name match
- Fuzzy name matching (handles typos, variations)
- 75%+ similarity threshold
- Creates two files:
Matched/- Contacts found in voter register (with full voter details)Unmatched/- Contacts not found (for manual review)
- Saves detailed log of matching process
MATCHING CONTACTS FROM: my_contacts.csv
=============================================
Loaded 150 contacts from my_contacts.csv
[1/150] MATCHED: Dan Nabaasa → DAN MUSINGUZI NABAASA (92.5%)
[2/150] MATCHED: John Ahimbisibwe → AHIMBISIBWE JOHN (100.0%)
[3/150] UNMATCHED: Mary Unknown
✓ Saved 120 matched contacts to: my_contacts_matched_20251109.csv
✓ Saved 30 unmatched contacts to: my_contacts_unmatched_20251109.csv
MATCHING SUMMARY
=============================================
Total Contacts: 150
Matched: 120 (80.0%)
Unmatched: 30 (20.0%)
D:\Voter-extractor/
├── input/ ← Original 54 PDF files
├── processed_v4/ ← CLEAN voter data (V4 extractor)
├── Contacts/ ← Contact matching (auto-created)
│ ├── Matched/
│ ├── Unmatched/
│ └── Logs/
├── logs/ ← Extraction logs
├── dnm_data.db ← Main database
│
├── manual_voter_manager.py ← Add/edit voters
├── contact_matcher_v2.py ← Match contacts
├── voter_extractor_v4.py ← Final extractor
│
└── app.py ← Web interface (run with: python app.py)
If you have contact files scattered around, move them to the Contacts/ folder:
# Example: Move contact files
move "my_contacts.csv" Contacts/
move "phone_list.xlsx" Contacts/Then scan for them:
python contact_matcher_v2.py --scanpython manual_voter_manager.py
# Choose option 2 (Search)
# Enter your nameIf not found → Use option 1 (Add new voter)
Option A: Use contact matcher to identify who's missing
python contact_matcher_v2.py your_list.csv Name
# Check Unmatched/ folder for who's not in registerOption B: Add them manually
python manual_voter_manager.py
# Use option 1 repeatedly# If you have a CSV with Name and Phone columns
python contact_matcher_v2.py contacts.csv Name Phone
# Check Contacts/Matched/ for results# Count files processed
dir /b processed_v4\*.csv | find /c /v ""
# View extraction log (latest file in logs/ folder)-
Verify Data Quality
python analyze_extraction_quality.py
-
Update Main Database
- The web interface (app.py) will need to load V4 data
- Script will be provided
-
Match All Contacts
# Match DNM Master Database python contact_matcher_v2.py "DNM Master Contact Database.xlsx" Name Phone Email # Match any other contact lists python contact_matcher_v2.py --scan # Find all contact files
-
Manual Review
- Add yourself if not found
- Add any critical team members missing
- Review
Contacts/Unmatched/for important people to add
- Extraction may still be running
- Try searching in original
processed/folder - Name might be spelled differently (use fuzzy search)
pip install openpyxl# Open the CSV file directly
type "processed_v4\AMIIZI MARUNGI CENTER_voters_v4.csv"- Use manual_voter_manager.py
- Search for voter → Edit option (coming soon)
- Or edit CSV file directly
Current: 30/54 files processed (56%)
To check progress:
# Count processed files
dir /b processed_v4\*.csv | find /c /v ""
# Check if still running
tasklist | findstr pythonWhen extraction completes, you'll see:
EXTRACTION COMPLETE - V4 FINAL
======================================================================
Files processed: 54
Successful: 54
Total voters extracted: ~15,000-18,000
Expected (official): 29,348
Extraction rate: 50-60%
======================================================================
- EXTRACTION_IMPROVEMENTS.md - Detailed analysis of improvements
- ARCHITECTURE.md - System architecture
- QUICKSTART.md - Web interface guide
Tools Ready: ✓ Manual Voter Manager | ✓ Contact Matcher V2 Extraction: Running (30/54 complete) Next: Complete extraction → Match contacts → Update database