z230
This commit is contained in:
+1099
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,38 @@
|
||||
"Protocol","Study Population","Country","Site","Principal Investigator","Participant ID","Baseline Stool Frequency","Visit","Visit Date","Endoscopy Completed?","Endoscopy Date","Bowel Preparation Start Date 1","Bowel Preparation End Date 1","Bowel Preparation Start Date 2","Bowel Preparation End Date 2","Central Endoscopy Score","Local Endoscopy Score","PGA Score","Eligible Day (-1)","Day (-1) Excluded Reason(s)","Eligible Day (-2)","Day (-2) Excluded Reason(s)","Eligible Day (-3)","Day (-3) Excluded Reason(s)","Eligible Day (-4)","Day (-4) Excluded Reason(s)","Eligible Day (-5)","Day (-5) Excluded Reason(s)","Eligible Day (-6)","Day (-6) Excluded Reason(s)","Eligible Day (-7)","Day (-7) Excluded Reason(s)","Eligible Day (-8)","Day (-8) Excluded Reason(s)","Eligible Day (-9)","Day (-9) Excluded Reason(s)","Eligible Day (-10)","Day (-10) Excluded Reason(s)","Eligible Day (-1) Stool Count","Eligible Day (-2) Stool Count","Eligible Day (-3) Stool Count","Eligible Day (-4) Stool Count","Eligible Day (-5) Stool Count","Eligible Day (-6) Stool Count","Eligible Day (-7) Stool Count","Eligible Day (-8) Stool Count","Eligible Day (-9) Stool Count","Eligible Day (-10) Stool Count","Stool Frequency Sub-score","Eligible Day (-1) Rectal Bleeding Score","Eligible Day (-2) Rectal Bleeding Score","Eligible Day (-3) Rectal Bleeding Score","Eligible Day (-4) Rectal Bleeding Score","Eligible Day (-5) Rectal Bleeding Score","Eligible Day (-6) Rectal Bleeding Score","Eligible Day (-7) Rectal Bleeding Score","Eligible Day (-8) Rectal Bleeding Score","Eligible Day (-9) Rectal Bleeding Score","Eligible Day (-10) Rectal Bleeding Score","Rectal Bleeding Sub-score","Partial Mayo Score","Modified Mayo Score","Full Mayo Score","Site Action","Last Mayo Score Submission","Week I-12 Clinical Responder","Week I-12 Clinical Remission","Clinical Flare","Loss of Response","Partial Mayo Response Post Loss of Response","Partial Mayo Response for Clinical Non-Responders"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012001","1","I-0","19 Feb 2026","Yes","05 Feb 2026","04 Feb 2026","04 Feb 2026","-","-","2","-","3","18 Feb 2026","-","17 Feb 2026","-","16 Feb 2026","-","15 Feb 2026","-","14 Feb 2026","-","13 Feb 2026","-","12 Feb 2026","-","11 Feb 2026","Day Not Applicable for Calculation","10 Feb 2026","Day Not Applicable for Calculation","09 Feb 2026","Day Not Applicable for Calculation","10","8","7","5","7","8","8","-","-","-","3","1","1","1","0","1","1","1","-","-","-","1","7","6","9","-","08 Apr 2026 07:11:25","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012001","1","I-2","04 Mar 2026","-","-","-","-","-","-","-","-","3","03 Mar 2026","-","02 Mar 2026","-","01 Mar 2026","-","28 Feb 2026","-","27 Feb 2026","-","26 Feb 2026","-","25 Feb 2026","-","24 Feb 2026","Day Not Applicable for Calculation","23 Feb 2026","Day Not Applicable for Calculation","22 Feb 2026","Day Not Applicable for Calculation","5","4","5","4","5","6","6","-","-","-","2","1","0","1","0","1","0","1","-","-","-","1","6","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012001","1","I-4","18 Mar 2026","-","-","-","-","-","-","-","-","2","17 Mar 2026","-","16 Mar 2026","-","15 Mar 2026","-","14 Mar 2026","-","13 Mar 2026","-","12 Mar 2026","-","11 Mar 2026","-","10 Mar 2026","Day Not Applicable for Calculation","09 Mar 2026","Day Not Applicable for Calculation","08 Mar 2026","Day Not Applicable for Calculation","5","5","5","4","5","4","5","-","-","-","2","1","0","0","1","1","1","0","-","-","-","1","5","","","-","08 Apr 2026 07:11:43","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012001","1","I-8","05 May 2026","-","-","-","-","-","-","-","-","1","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","Day Not Applicable for Calculation","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","3","3","4","4","5","4","4","-","-","-","2","1","1","1","1","1","1","1","-","-","-","1","4","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012001","1","I-12","13 May 2026","Yes","06 May 2026","05 May 2026","05 May 2026","-","-","1","-","1","12 May 2026","-","11 May 2026","-","10 May 2026","-","09 May 2026","-","08 May 2026","-","07 May 2026","-","06 May 2026","Endoscopy","05 May 2026","Bowel Preparation for Procedure;Day Not Applicable for Calculation","04 May 2026","-","03 May 2026","Day Not Applicable for Calculation","5","4","6","5","5","5","-","-","3","-","2","1","0","1","1","1","1","-","-","1","-","1","4","4","5","-","-","Clinical Responder","No","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012002","1","I-0","08 Apr 2026","Yes","18 Mar 2026","17 Mar 2026","18 Mar 2026","-","-","2","-","2","07 Apr 2026","-","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","Missing Diary","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","-","31 Mar 2026","Day Not Applicable for Calculation","30 Mar 2026","Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","3","3","4","-","3","3","4","-","-","-","1","0","0","0","-","0","0","1","-","-","-","0","3","3","5","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012002","1","I-2","23 Apr 2026","-","-","-","-","-","-","-","-","2","22 Apr 2026","Missing Diary","21 Apr 2026","-","20 Apr 2026","-","19 Apr 2026","-","18 Apr 2026","-","17 Apr 2026","-","16 Apr 2026","-","15 Apr 2026","Day Not Applicable for Calculation","14 Apr 2026","Day Not Applicable for Calculation","13 Apr 2026","Day Not Applicable for Calculation","-","3","3","6","5","5","4","-","-","-","2","-","0","0","1","1","1","1","-","-","-","1","5","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012002","1","I-4","06 May 2026","-","-","-","-","-","-","-","-","1","05 May 2026","-","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","Day Not Applicable for Calculation","27 Apr 2026","Day Not Applicable for Calculation","26 Apr 2026","Day Not Applicable for Calculation","6","3","2","3","3","3","3","-","-","-","1","1","0","0","0","1","1","0","-","-","-","0","2","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10001","Matej Falc","CZ100012003","1","I-0","27 May 2026","Yes","13 May 2026","12 May 2026","12 May 2026","-","-","3","-","2","26 May 2026","-","25 May 2026","-","24 May 2026","-","23 May 2026","-","22 May 2026","-","21 May 2026","-","20 May 2026","-","19 May 2026","Day Not Applicable for Calculation","18 May 2026","Day Not Applicable for Calculation","17 May 2026","Day Not Applicable for Calculation","6","9","7","8","9","7","8","-","-","-","3","2","2","2","2","1","1","1","-","-","-","2","7","8","10","-","27 May 2026 07:24:39","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10006","Michal Konecny","CZ100062001","1","I-0","20 Mar 2026","Yes","19 Feb 2026","-","-","-","-","3","-","3","19 Mar 2026","-","18 Mar 2026","-","17 Mar 2026","-","16 Mar 2026","-","15 Mar 2026","-","14 Mar 2026","-","13 Mar 2026","-","12 Mar 2026","Day Not Applicable for Calculation","11 Mar 2026","Day Not Applicable for Calculation","10 Mar 2026","Day Not Applicable for Calculation","7","7","8","8","7","8","5","-","-","-","3","2","1","1","1","1","1","0","-","-","-","1","7","7","10","-","20 Mar 2026 07:02:44","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10006","Michal Konecny","CZ100062001","1","I-2","08 Apr 2026","-","-","-","-","-","-","-","-","2","07 Apr 2026","Medication For Diarrhea","06 Apr 2026","Medication For Diarrhea","05 Apr 2026","Medication For Diarrhea","04 Apr 2026","Medication For Diarrhea","03 Apr 2026","Medication For Diarrhea","02 Apr 2026","Medication For Diarrhea","01 Apr 2026","Medication For Diarrhea","31 Mar 2026","Medication For Diarrhea;Day Not Applicable for Calculation","30 Mar 2026","Medication For Diarrhea;Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","-","-","-","-","-","-","-","-","-","-","Non-Evaluable","-","-","-","-","-","-","-","-","-","-","Non-Evaluable","Non-Evaluable","Non-Evaluable","Non-Evaluable","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10006","Michal Konecny","CZ100062001","1","I-4","15 Apr 2026","-","-","-","-","-","-","-","-","3","14 Apr 2026","-","13 Apr 2026","-","12 Apr 2026","-","11 Apr 2026","-","10 Apr 2026","-","09 Apr 2026","-","08 Apr 2026","-","07 Apr 2026","Medication For Diarrhea;Day Not Applicable for Calculation","06 Apr 2026","Medication For Diarrhea;Day Not Applicable for Calculation","05 Apr 2026","Medication For Diarrhea;Day Not Applicable for Calculation","9","22","20","19","17","18","18","-","-","-","3","1","3","2","2","2","2","2","-","-","-","2","8","","","-","04 May 2026 22:06:47","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10006","Michal Konecny","CZ100062001","1","I-8","18 May 2026","-","-","-","-","-","-","-","-","2","17 May 2026","-","16 May 2026","-","15 May 2026","-","14 May 2026","-","13 May 2026","-","12 May 2026","-","11 May 2026","-","10 May 2026","Day Not Applicable for Calculation","09 May 2026","Day Not Applicable for Calculation","08 May 2026","Day Not Applicable for Calculation","7","5","9","7","7","8","8","-","-","-","3","1","1","1","1","1","1","1","-","-","-","1","6","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10006","Michal Konecny","CZ100062002","1","I-0","26 May 2026","Yes","14 May 2026","13 May 2026","13 May 2026","-","-","2","-","2","25 May 2026","-","24 May 2026","-","23 May 2026","-","22 May 2026","-","21 May 2026","-","20 May 2026","-","19 May 2026","-","18 May 2026","Day Not Applicable for Calculation","17 May 2026","Day Not Applicable for Calculation","16 May 2026","Day Not Applicable for Calculation","8","8","6","7","7","6","7","-","-","-","3","2","2","2","2","2","2","2","-","-","-","2","7","7","9","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10009","Jiri Pumprla","CZ100092001","1","I-0","05 May 2026","Yes","24 Apr 2026","23 Apr 2026","23 Apr 2026","-","-","2","-","2","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","Day Not Applicable for Calculation","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","5","5","5","5","5","5","5","-","-","-","2","1","1","1","1","1","1","1","-","-","-","1","5","5","7","-","05 May 2026 11:19:40","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10009","Jiri Pumprla","CZ100092001","1","I-2","19 May 2026","-","-","-","-","-","-","-","-","1","18 May 2026","-","17 May 2026","-","16 May 2026","-","15 May 2026","-","14 May 2026","-","13 May 2026","-","12 May 2026","-","11 May 2026","Day Not Applicable for Calculation","10 May 2026","Day Not Applicable for Calculation","09 May 2026","Day Not Applicable for Calculation","5","4","5","5","5","4","6","-","-","-","2","1","1","1","1","1","1","1","-","-","-","1","4","","","-","19 May 2026 10:38:25","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10012","Stefan Konecny","CZ100122001","5","I-0","07 Apr 2026","Yes","24 Mar 2026","22 Mar 2026","22 Mar 2026","-","-","2","-","2","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","-","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","-","31 Mar 2026","-","30 Mar 2026","Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","28 Mar 2026","Day Not Applicable for Calculation","8","11","5","9","11","10","13","-","-","-","3","1","2","2","2","2","2","2","-","-","-","2","7","7","9","-","04 May 2026 08:44:52","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10012","Stefan Konecny","CZ100122001","5","I-2","22 Apr 2026","-","-","-","-","-","-","-","-","2","21 Apr 2026","-","20 Apr 2026","-","19 Apr 2026","-","18 Apr 2026","-","17 Apr 2026","-","16 Apr 2026","-","15 Apr 2026","-","14 Apr 2026","Day Not Applicable for Calculation","13 Apr 2026","Day Not Applicable for Calculation","12 Apr 2026","Day Not Applicable for Calculation","7","5","6","6","7","8","2","-","-","-","1","1","0","1","1","1","2","0","-","-","-","1","4","","","-","04 May 2026 08:45:07","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10012","Stefan Konecny","CZ100122001","5","I-4","07 May 2026","-","-","-","-","-","-","-","-","1","06 May 2026","-","05 May 2026","-","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","Day Not Applicable for Calculation","28 Apr 2026","Day Not Applicable for Calculation","27 Apr 2026","Day Not Applicable for Calculation","8","7","7","8","4","11","7","-","-","-","1","2","1","1","1","0","1","1","-","-","-","1","3","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10013","David Stepek","CZ100132001","1","I-0","24 Mar 2026","Yes","12 Mar 2026","11 Mar 2026","11 Mar 2026","-","-","2","-","2","23 Mar 2026","-","22 Mar 2026","-","21 Mar 2026","-","20 Mar 2026","-","19 Mar 2026","-","18 Mar 2026","-","17 Mar 2026","-","16 Mar 2026","Day Not Applicable for Calculation","15 Mar 2026","Day Not Applicable for Calculation","14 Mar 2026","Day Not Applicable for Calculation","8","6","5","7","6","7","6","-","-","-","3","1","1","1","0","1","1","1","-","-","-","1","6","6","8","-","05 Apr 2026 22:41:27","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10013","David Stepek","CZ100132001","1","I-2","08 Apr 2026","-","-","-","-","-","-","-","-","2","07 Apr 2026","-","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","-","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","-","31 Mar 2026","Day Not Applicable for Calculation","30 Mar 2026","Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","5","2","3","6","5","5","5","-","-","-","2","0","0","0","0","1","1","0","-","-","-","0","4","","","-","27 May 2026 12:53:52","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10013","David Stepek","CZ100132001","1","I-4","21 Apr 2026","-","-","-","-","-","-","-","-","0","20 Apr 2026","-","19 Apr 2026","-","18 Apr 2026","-","17 Apr 2026","-","16 Apr 2026","-","15 Apr 2026","-","14 Apr 2026","-","13 Apr 2026","Day Not Applicable for Calculation","12 Apr 2026","Day Not Applicable for Calculation","11 Apr 2026","Day Not Applicable for Calculation","4","3","4","3","3","4","4","-","-","-","2","0","0","0","0","0","0","0","-","-","-","0","2","","","-","27 May 2026 12:54:41","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10013","David Stepek","CZ100132002","1","I-0","12 May 2026","Yes","21 Apr 2026","20 Apr 2026","21 Apr 2026","-","-","2","-","2","11 May 2026","-","10 May 2026","-","09 May 2026","-","08 May 2026","-","07 May 2026","-","06 May 2026","-","05 May 2026","Missing Diary","04 May 2026","Day Not Applicable for Calculation","03 May 2026","Day Not Applicable for Calculation","02 May 2026","Day Not Applicable for Calculation","2","1","1","1","1","2","-","-","-","-","0","0","0","0","0","0","0","-","-","-","-","0","2","2","4","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10013","David Stepek","CZ100132002","1","I-2","26 May 2026","-","-","-","-","-","-","-","-","1","25 May 2026","-","24 May 2026","Missing Diary","23 May 2026","-","22 May 2026","-","21 May 2026","-","20 May 2026","-","19 May 2026","-","18 May 2026","Missing Diary;Day Not Applicable for Calculation","17 May 2026","Day Not Applicable for Calculation","16 May 2026","Day Not Applicable for Calculation","1","-","1","2","1","2","2","-","-","-","1","0","-","0","0","0","0","0","-","-","-","0","2","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adolescent","Czech Republic","DD5-CZ10020","Lucie Gonsorcikova","CZ100201001","1","Unscheduled 1","04 May 2026","Yes","20 Apr 2026","12 Apr 2026","15 Apr 2026","-","-","2","-","3","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","-","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","24 Apr 2026","Day Not Applicable for Calculation","5","6","6","7","6","3","3","-","-","-","2","0","0","0","0","0","0","0","-","-","-","0","5","4","7","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adolescent","Czech Republic","DD5-CZ10020","Lucie Gonsorcikova","CZ100201001","1","I-0","18 May 2026","Yes","01 May 2026","01 May 2026","01 May 2026","-","-","2","-","3","17 May 2026","-","16 May 2026","-","15 May 2026","-","14 May 2026","-","13 May 2026","-","12 May 2026","-","11 May 2026","-","10 May 2026","Day Not Applicable for Calculation","09 May 2026","Day Not Applicable for Calculation","08 May 2026","Day Not Applicable for Calculation","6","6","6","6","6","6","6","-","-","-","3","0","0","0","0","0","0","0","-","-","-","0","6","5","8","-","04 May 2026 09:51:14","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10021","Martin Bortlik","CZ100212001","1","I-0","07 Apr 2026","Yes","16 Mar 2026","15 Mar 2026","16 Mar 2026","-","-","3","-","3","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","-","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","-","31 Mar 2026","-","30 Mar 2026","Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","28 Mar 2026","Day Not Applicable for Calculation","11","11","10","11","11","10","9","-","-","-","3","2","2","2","2","2","2","2","-","-","-","2","8","8","11","-","20 Apr 2026 09:27:58","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10021","Martin Bortlik","CZ100212001","1","I-2","20 Apr 2026","-","-","-","-","-","-","-","-","3","19 Apr 2026","-","18 Apr 2026","-","17 Apr 2026","-","16 Apr 2026","-","15 Apr 2026","-","14 Apr 2026","-","13 Apr 2026","-","12 Apr 2026","Day Not Applicable for Calculation","11 Apr 2026","Day Not Applicable for Calculation","10 Apr 2026","Day Not Applicable for Calculation","8","7","9","8","8","7","8","-","-","-","3","2","2","1","1","1","2","1","-","-","-","1","7","","","-","20 Apr 2026 09:29:01","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10021","Martin Bortlik","CZ100212001","1","I-4","05 May 2026","-","-","-","-","-","-","-","-","1","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","Day Not Applicable for Calculation","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","6","6","6","6","7","7","6","-","-","-","3","0","0","1","1","1","1","1","-","-","-","1","5","","","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222002","1","I-0","19 Feb 2026","Yes","11 Feb 2026","10 Feb 2026","11 Feb 2026","-","-","2","-","2","18 Feb 2026","-","17 Feb 2026","-","16 Feb 2026","-","15 Feb 2026","-","14 Feb 2026","-","13 Feb 2026","-","12 Feb 2026","-","11 Feb 2026","Endoscopy;Bowel Preparation for Procedure;Day Not Applicable for Calculation","10 Feb 2026","Bowel Preparation for Procedure;Day Not Applicable for Calculation","09 Feb 2026","Day Not Applicable for Calculation","3","2","2","3","4","3","2","-","-","-","1","1","1","0","0","0","2","2","-","-","-","1","4","4","6","-","19 Feb 2026 15:41:35","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222003","1","I-0","09 Mar 2026","Yes","11 Feb 2026","10 Feb 2026","11 Feb 2026","-","-","2","-","2","08 Mar 2026","-","07 Mar 2026","-","06 Mar 2026","-","05 Mar 2026","-","04 Mar 2026","-","03 Mar 2026","Missing Diary","02 Mar 2026","Missing Diary","01 Mar 2026","Missing Diary;Day Not Applicable for Calculation","28 Feb 2026","Missing Diary;Day Not Applicable for Calculation","27 Feb 2026","Missing Diary;Day Not Applicable for Calculation","7","7","6","6","7","-","-","-","-","-","3","2","2","2","2","2","-","-","-","-","-","2","7","7","9","-","22 Mar 2026 18:34:58","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222003","1","I-2","27 Mar 2026","-","-","-","-","-","-","-","-","2","26 Mar 2026","-","25 Mar 2026","-","24 Mar 2026","-","23 Mar 2026","-","22 Mar 2026","-","21 Mar 2026","-","20 Mar 2026","-","19 Mar 2026","Day Not Applicable for Calculation","18 Mar 2026","Day Not Applicable for Calculation","17 Mar 2026","Day Not Applicable for Calculation","7","3","3","3","5","5","5","-","-","-","2","0","0","1","1","1","1","2","-","-","-","1","5","","","-","27 Mar 2026 07:22:31","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222003","1","I-4","08 Apr 2026","-","-","-","-","-","-","-","-","2","07 Apr 2026","-","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","-","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","-","31 Mar 2026","Day Not Applicable for Calculation","30 Mar 2026","Day Not Applicable for Calculation","29 Mar 2026","Day Not Applicable for Calculation","3","3","4","4","5","4","3","-","-","-","2","1","0","0","2","1","1","2","-","-","-","1","5","","","-","08 Apr 2026 07:59:35","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222003","1","I-8","04 May 2026","-","-","-","-","-","-","-","-","2","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","-","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","24 Apr 2026","Missing Diary;Day Not Applicable for Calculation","3","5","3","3","3","2","3","-","-","-","1","0","0","0","0","0","0","0","-","-","-","0","3","","","-","04 May 2026 07:52:47","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222005","1","I-0","09 Apr 2026","Yes","08 Apr 2026","31 Mar 2026","01 Apr 2026","-","-","2","-","2","08 Apr 2026","Endoscopy","07 Apr 2026","-","06 Apr 2026","-","05 Apr 2026","-","04 Apr 2026","-","03 Apr 2026","-","02 Apr 2026","-","01 Apr 2026","Bowel Preparation for Procedure;Day Not Applicable for Calculation","31 Mar 2026","Bowel Preparation for Procedure;Day Not Applicable for Calculation","30 Mar 2026","-","-","3","3","4","3","4","3","-","-","3","1","-","2","2","2","2","2","2","-","-","2","2","5","5","7","-","-","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222005","1","I-2","22 Apr 2026","-","-","-","-","-","-","-","-","2","21 Apr 2026","-","20 Apr 2026","-","19 Apr 2026","-","18 Apr 2026","-","17 Apr 2026","-","16 Apr 2026","-","15 Apr 2026","-","14 Apr 2026","Day Not Applicable for Calculation","13 Apr 2026","Day Not Applicable for Calculation","12 Apr 2026","Day Not Applicable for Calculation","3","3","5","3","2","3","2","-","-","-","1","1","2","2","1","1","1","2","-","-","-","1","4","","","-","22 Apr 2026 14:03:33","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
"77242113UCO3001","Adult","Czech Republic","DD5-CZ10022","Petr Hrabak","CZ100222005","1","I-4","05 May 2026","-","-","-","-","-","-","-","-","2","04 May 2026","-","03 May 2026","-","02 May 2026","-","01 May 2026","-","30 Apr 2026","-","29 Apr 2026","-","28 Apr 2026","-","27 Apr 2026","Day Not Applicable for Calculation","26 Apr 2026","Day Not Applicable for Calculation","25 Apr 2026","Day Not Applicable for Calculation","4","2","2","2","2","2","2","-","-","-","1","1","1","1","1","2","1","1","-","-","-","1","4","","","-","05 May 2026 07:30:02","N/A","N/A","N/A","N/A","N/A","N/A"
|
||||
|
@@ -0,0 +1,38 @@
|
||||
Protocol,Study Population,Country,Site,Principal Investigator,Participant ID,Baseline Stool Frequency,Visit,Visit Date,Endoscopy Completed?,Endoscopy Date,Bowel Preparation Start Date 1,Bowel Preparation End Date 1,Bowel Preparation Start Date 2,Bowel Preparation End Date 2,Central Endoscopy Score,Local Endoscopy Score,PGA Score,Eligible Day (-1),Day (-1) Excluded Reason(s),Eligible Day (-2),Day (-2) Excluded Reason(s),Eligible Day (-3),Day (-3) Excluded Reason(s),Eligible Day (-4),Day (-4) Excluded Reason(s),Eligible Day (-5),Day (-5) Excluded Reason(s),Eligible Day (-6),Day (-6) Excluded Reason(s),Eligible Day (-7),Day (-7) Excluded Reason(s),Eligible Day (-8),Day (-8) Excluded Reason(s),Eligible Day (-9),Day (-9) Excluded Reason(s),Eligible Day (-10),Day (-10) Excluded Reason(s),Eligible Day (-1) Stool Count,Eligible Day (-2) Stool Count,Eligible Day (-3) Stool Count,Eligible Day (-4) Stool Count,Eligible Day (-5) Stool Count,Eligible Day (-6) Stool Count,Eligible Day (-7) Stool Count,Eligible Day (-8) Stool Count,Eligible Day (-9) Stool Count,Eligible Day (-10) Stool Count,Stool Frequency Sub-score,Eligible Day (-1) Rectal Bleeding Score,Eligible Day (-2) Rectal Bleeding Score,Eligible Day (-3) Rectal Bleeding Score,Eligible Day (-4) Rectal Bleeding Score,Eligible Day (-5) Rectal Bleeding Score,Eligible Day (-6) Rectal Bleeding Score,Eligible Day (-7) Rectal Bleeding Score,Eligible Day (-8) Rectal Bleeding Score,Eligible Day (-9) Rectal Bleeding Score,Eligible Day (-10) Rectal Bleeding Score,Rectal Bleeding Sub-score,Partial Mayo Score,Modified Mayo Score,Full Mayo Score,Site Action,Last Mayo Score Submission,Week I-12 Clinical Responder,Week I-12 Clinical Remission,Clinical Flare,Loss of Response,Partial Mayo Response Post Loss of Response,Partial Mayo Response for Clinical Non-Responders
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012001,1,I-0,19 Feb 2026,Yes,05 Feb 2026,04 Feb 2026,04 Feb 2026,-,-,2,-,3,18 Feb 2026,-,17 Feb 2026,-,16 Feb 2026,-,15 Feb 2026,-,14 Feb 2026,-,13 Feb 2026,-,12 Feb 2026,-,11 Feb 2026,Day Not Applicable for Calculation,10 Feb 2026,Day Not Applicable for Calculation,09 Feb 2026,Day Not Applicable for Calculation,10,8,7,5,7,8,8,-,-,-,3,1,1,1,0,1,1,1,-,-,-,1,7,6,10,-,08 Apr 2026 07:11:25,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012001,1,I-2,04 Mar 2026,-,-,-,-,-,-,-,-,3,03 Mar 2026,-,02 Mar 2026,-,01 Mar 2026,-,28 Feb 2026,-,27 Feb 2026,-,26 Feb 2026,-,25 Feb 2026,-,24 Feb 2026,Day Not Applicable for Calculation,23 Feb 2026,Day Not Applicable for Calculation,22 Feb 2026,Day Not Applicable for Calculation,5,4,5,4,5,6,6,-,-,-,2,1,0,1,0,1,0,1,-,-,-,1,6,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012001,1,I-4,18 Mar 2026,-,-,-,-,-,-,-,-,2,17 Mar 2026,-,16 Mar 2026,-,15 Mar 2026,-,14 Mar 2026,-,13 Mar 2026,-,12 Mar 2026,-,11 Mar 2026,-,10 Mar 2026,Day Not Applicable for Calculation,09 Mar 2026,Day Not Applicable for Calculation,08 Mar 2026,Day Not Applicable for Calculation,5,5,5,4,5,4,5,-,-,-,2,1,0,0,1,1,1,0,-,-,-,1,5,,,-,08 Apr 2026 07:11:43,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012001,1,I-8,05 May 2026,-,-,-,-,-,-,-,-,1,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,Day Not Applicable for Calculation,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,3,3,4,4,5,4,4,-,-,-,2,1,1,1,1,1,1,1,-,-,-,1,4,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012001,1,I-12,13 May 2026,Yes,06 May 2026,05 May 2026,05 May 2026,-,-,1,-,1,12 May 2026,-,11 May 2026,-,10 May 2026,-,09 May 2026,-,08 May 2026,-,07 May 2026,-,06 May 2026,Endoscopy,05 May 2026,Bowel Preparation for Procedure;Day Not Applicable for Calculation,04 May 2026,-,03 May 2026,Day Not Applicable for Calculation,5,4,6,5,5,5,-,-,3,-,2,1,0,1,1,1,1,-,-,1,-,1,4,4,5,-,-,Clinical Responder,No,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012002,1,I-0,08 Apr 2026,Yes,18 Mar 2026,17 Mar 2026,18 Mar 2026,-,-,2,-,2,07 Apr 2026,-,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,Missing Diary,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,-,31 Mar 2026,Day Not Applicable for Calculation,30 Mar 2026,Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,3,3,4,-,3,3,4,-,-,-,1,0,0,0,-,0,0,1,-,-,-,0,3,3,5,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012002,1,I-2,23 Apr 2026,-,-,-,-,-,-,-,-,2,22 Apr 2026,Missing Diary,21 Apr 2026,-,20 Apr 2026,-,19 Apr 2026,-,18 Apr 2026,-,17 Apr 2026,-,16 Apr 2026,-,15 Apr 2026,Day Not Applicable for Calculation,14 Apr 2026,Day Not Applicable for Calculation,13 Apr 2026,Day Not Applicable for Calculation,-,3,3,6,5,5,4,-,-,-,2,-,0,0,1,1,1,1,-,-,-,1,5,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012002,1,I-4,06 May 2026,-,-,-,-,-,-,-,-,1,05 May 2026,-,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,Day Not Applicable for Calculation,27 Apr 2026,Day Not Applicable for Calculation,26 Apr 2026,Day Not Applicable for Calculation,6,3,2,3,3,3,3,-,-,-,1,1,0,0,0,1,1,0,-,-,-,0,2,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10001,Matej Falc,CZ100012003,1,I-0,27 May 2026,Yes,13 May 2026,12 May 2026,12 May 2026,-,-,3,-,2,26 May 2026,-,25 May 2026,-,24 May 2026,-,23 May 2026,-,22 May 2026,-,21 May 2026,-,20 May 2026,-,19 May 2026,Day Not Applicable for Calculation,18 May 2026,Day Not Applicable for Calculation,17 May 2026,Day Not Applicable for Calculation,6,9,7,8,9,7,8,-,-,-,3,2,2,2,2,1,1,1,-,-,-,2,7,8,10,-,27 May 2026 07:24:39,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10006,Michal Konecny,CZ100062001,1,I-0,20 Mar 2026,Yes,19 Feb 2026,-,-,-,-,3,-,3,19 Mar 2026,-,18 Mar 2026,-,17 Mar 2026,-,16 Mar 2026,-,15 Mar 2026,-,14 Mar 2026,-,13 Mar 2026,-,12 Mar 2026,Day Not Applicable for Calculation,11 Mar 2026,Day Not Applicable for Calculation,10 Mar 2026,Day Not Applicable for Calculation,7,7,8,8,7,8,5,-,-,-,3,2,1,1,1,1,1,0,-,-,-,1,7,7,10,-,20 Mar 2026 07:02:44,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10006,Michal Konecny,CZ100062001,1,I-2,08 Apr 2026,-,-,-,-,-,-,-,-,2,07 Apr 2026,Medication For Diarrhea,06 Apr 2026,Medication For Diarrhea,05 Apr 2026,Medication For Diarrhea,04 Apr 2026,Medication For Diarrhea,03 Apr 2026,Medication For Diarrhea,02 Apr 2026,Medication For Diarrhea,01 Apr 2026,Medication For Diarrhea,31 Mar 2026,Medication For Diarrhea;Day Not Applicable for Calculation,30 Mar 2026,Medication For Diarrhea;Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,-,-,-,-,-,-,-,-,-,-,Non-Evaluable,-,-,-,-,-,-,-,-,-,-,Non-Evaluable,Non-Evaluable,Non-Evaluable,Non-Evaluable,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10006,Michal Konecny,CZ100062001,1,I-4,15 Apr 2026,-,-,-,-,-,-,-,-,3,14 Apr 2026,-,13 Apr 2026,-,12 Apr 2026,-,11 Apr 2026,-,10 Apr 2026,-,09 Apr 2026,-,08 Apr 2026,-,07 Apr 2026,Medication For Diarrhea;Day Not Applicable for Calculation,06 Apr 2026,Medication For Diarrhea;Day Not Applicable for Calculation,05 Apr 2026,Medication For Diarrhea;Day Not Applicable for Calculation,9,22,20,19,17,18,18,-,-,-,3,1,3,2,2,2,2,2,-,-,-,2,8,,,-,04 May 2026 22:06:47,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10006,Michal Konecny,CZ100062001,1,I-8,18 May 2026,-,-,-,-,-,-,-,-,2,17 May 2026,-,16 May 2026,-,15 May 2026,-,14 May 2026,-,13 May 2026,-,12 May 2026,-,11 May 2026,-,10 May 2026,Day Not Applicable for Calculation,09 May 2026,Day Not Applicable for Calculation,08 May 2026,Day Not Applicable for Calculation,7,5,9,7,7,8,8,-,-,-,3,1,1,1,1,1,1,1,-,-,-,1,6,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10006,Michal Konecny,CZ100062002,1,I-0,26 May 2026,Yes,14 May 2026,13 May 2026,13 May 2026,-,-,2,-,2,25 May 2026,-,24 May 2026,-,23 May 2026,-,22 May 2026,-,21 May 2026,-,20 May 2026,-,19 May 2026,-,18 May 2026,Day Not Applicable for Calculation,17 May 2026,Day Not Applicable for Calculation,16 May 2026,Day Not Applicable for Calculation,8,8,6,7,7,6,7,-,-,-,3,2,2,2,2,2,2,2,-,-,-,2,7,7,9,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10009,Jiri Pumprla,CZ100092001,1,I-0,05 May 2026,Yes,24 Apr 2026,23 Apr 2026,23 Apr 2026,-,-,2,-,2,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,Day Not Applicable for Calculation,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,5,5,5,5,5,5,5,-,-,-,2,1,1,1,1,1,1,1,-,-,-,1,5,5,7,-,05 May 2026 11:19:40,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10009,Jiri Pumprla,CZ100092001,1,I-2,19 May 2026,-,-,-,-,-,-,-,-,1,18 May 2026,-,17 May 2026,-,16 May 2026,-,15 May 2026,-,14 May 2026,-,13 May 2026,-,12 May 2026,-,11 May 2026,Day Not Applicable for Calculation,10 May 2026,Day Not Applicable for Calculation,09 May 2026,Day Not Applicable for Calculation,5,4,5,5,5,4,6,-,-,-,2,1,1,1,1,1,1,1,-,-,-,1,4,,,-,19 May 2026 10:38:25,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10012,Stefan Konecny,CZ100122001,5,I-0,07 Apr 2026,Yes,24 Mar 2026,22 Mar 2026,22 Mar 2026,-,-,2,-,2,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,-,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,-,31 Mar 2026,-,30 Mar 2026,Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,28 Mar 2026,Day Not Applicable for Calculation,8,11,5,9,11,10,13,-,-,-,3,1,2,2,2,2,2,2,-,-,-,2,7,7,9,-,04 May 2026 08:44:52,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10012,Stefan Konecny,CZ100122001,5,I-2,22 Apr 2026,-,-,-,-,-,-,-,-,2,21 Apr 2026,-,20 Apr 2026,-,19 Apr 2026,-,18 Apr 2026,-,17 Apr 2026,-,16 Apr 2026,-,15 Apr 2026,-,14 Apr 2026,Day Not Applicable for Calculation,13 Apr 2026,Day Not Applicable for Calculation,12 Apr 2026,Day Not Applicable for Calculation,7,5,6,6,7,8,2,-,-,-,1,1,0,1,1,1,2,0,-,-,-,1,4,,,-,04 May 2026 08:45:07,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10012,Stefan Konecny,CZ100122001,5,I-4,07 May 2026,-,-,-,-,-,-,-,-,1,06 May 2026,-,05 May 2026,-,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,Day Not Applicable for Calculation,28 Apr 2026,Day Not Applicable for Calculation,27 Apr 2026,Day Not Applicable for Calculation,8,7,7,8,4,11,7,-,-,-,1,2,1,1,1,0,1,1,-,-,-,1,3,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10013,David Stepek,CZ100132001,1,I-0,24 Mar 2026,Yes,12 Mar 2026,11 Mar 2026,11 Mar 2026,-,-,2,-,2,23 Mar 2026,-,22 Mar 2026,-,21 Mar 2026,-,20 Mar 2026,-,19 Mar 2026,-,18 Mar 2026,-,17 Mar 2026,-,16 Mar 2026,Day Not Applicable for Calculation,15 Mar 2026,Day Not Applicable for Calculation,14 Mar 2026,Day Not Applicable for Calculation,8,6,5,7,6,7,6,-,-,-,3,1,1,1,0,1,1,1,-,-,-,1,6,6,8,-,05 Apr 2026 22:41:27,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10013,David Stepek,CZ100132001,1,I-2,08 Apr 2026,-,-,-,-,-,-,-,-,2,07 Apr 2026,-,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,-,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,-,31 Mar 2026,Day Not Applicable for Calculation,30 Mar 2026,Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,5,2,3,6,5,5,5,-,-,-,2,0,0,0,0,1,1,0,-,-,-,0,4,,,-,27 May 2026 12:53:52,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10013,David Stepek,CZ100132001,1,I-4,21 Apr 2026,-,-,-,-,-,-,-,-,0,20 Apr 2026,-,19 Apr 2026,-,18 Apr 2026,-,17 Apr 2026,-,16 Apr 2026,-,15 Apr 2026,-,14 Apr 2026,-,13 Apr 2026,Day Not Applicable for Calculation,12 Apr 2026,Day Not Applicable for Calculation,11 Apr 2026,Day Not Applicable for Calculation,4,3,4,3,3,4,4,-,-,-,2,0,0,0,0,0,0,0,-,-,-,0,2,,,-,27 May 2026 12:54:41,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10013,David Stepek,CZ100132002,1,I-0,12 May 2026,Yes,21 Apr 2026,20 Apr 2026,21 Apr 2026,-,-,2,-,2,11 May 2026,-,10 May 2026,-,09 May 2026,-,08 May 2026,-,07 May 2026,-,06 May 2026,-,05 May 2026,Missing Diary,04 May 2026,Day Not Applicable for Calculation,03 May 2026,Day Not Applicable for Calculation,02 May 2026,Day Not Applicable for Calculation,2,1,1,1,1,2,-,-,-,-,0,0,0,0,0,0,0,-,-,-,-,0,2,2,4,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10013,David Stepek,CZ100132002,1,I-2,26 May 2026,-,-,-,-,-,-,-,-,1,25 May 2026,-,24 May 2026,Missing Diary,23 May 2026,-,22 May 2026,-,21 May 2026,-,20 May 2026,-,19 May 2026,-,18 May 2026,Missing Diary;Day Not Applicable for Calculation,17 May 2026,Day Not Applicable for Calculation,16 May 2026,Day Not Applicable for Calculation,1,-,1,2,1,2,2,-,-,-,1,0,-,0,0,0,0,0,-,-,-,0,2,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adolescent,Czech Republic,DD5-CZ10020,Lucie Gonsorcikova,CZ100201001,1,Unscheduled 1,04 May 2026,Yes,20 Apr 2026,12 Apr 2026,15 Apr 2026,-,-,2,-,3,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,-,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,24 Apr 2026,Day Not Applicable for Calculation,5,6,6,7,6,3,3,-,-,-,2,0,0,0,0,0,0,0,-,-,-,0,5,4,7,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adolescent,Czech Republic,DD5-CZ10020,Lucie Gonsorcikova,CZ100201001,1,I-0,18 May 2026,Yes,01 May 2026,01 May 2026,01 May 2026,-,-,2,-,3,17 May 2026,-,16 May 2026,-,15 May 2026,-,14 May 2026,-,13 May 2026,-,12 May 2026,-,11 May 2026,-,10 May 2026,Day Not Applicable for Calculation,09 May 2026,Day Not Applicable for Calculation,08 May 2026,Day Not Applicable for Calculation,6,6,6,6,6,6,6,-,-,-,3,0,0,0,0,0,0,0,-,-,-,0,6,5,8,-,04 May 2026 09:51:14,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10021,Martin Bortlik,CZ100212001,1,I-0,07 Apr 2026,Yes,16 Mar 2026,15 Mar 2026,16 Mar 2026,-,-,3,-,3,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,-,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,-,31 Mar 2026,-,30 Mar 2026,Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,28 Mar 2026,Day Not Applicable for Calculation,11,11,10,11,11,10,9,-,-,-,3,2,2,2,2,2,2,2,-,-,-,2,8,8,11,-,20 Apr 2026 09:27:58,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10021,Martin Bortlik,CZ100212001,1,I-2,20 Apr 2026,-,-,-,-,-,-,-,-,3,19 Apr 2026,-,18 Apr 2026,-,17 Apr 2026,-,16 Apr 2026,-,15 Apr 2026,-,14 Apr 2026,-,13 Apr 2026,-,12 Apr 2026,Day Not Applicable for Calculation,11 Apr 2026,Day Not Applicable for Calculation,10 Apr 2026,Day Not Applicable for Calculation,8,7,9,8,8,7,8,-,-,-,3,2,2,1,1,1,2,1,-,-,-,1,7,,,-,20 Apr 2026 09:29:01,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10021,Martin Bortlik,CZ100212001,1,I-4,05 May 2026,-,-,-,-,-,-,-,-,1,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,Day Not Applicable for Calculation,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,6,6,6,6,7,7,6,-,-,-,3,0,0,1,1,1,1,1,-,-,-,1,5,,,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222002,1,I-0,19 Feb 2026,Yes,11 Feb 2026,10 Feb 2026,11 Feb 2026,-,-,2,-,2,18 Feb 2026,-,17 Feb 2026,-,16 Feb 2026,-,15 Feb 2026,-,14 Feb 2026,-,13 Feb 2026,-,12 Feb 2026,-,11 Feb 2026,Endoscopy;Bowel Preparation for Procedure;Day Not Applicable for Calculation,10 Feb 2026,Bowel Preparation for Procedure;Day Not Applicable for Calculation,09 Feb 2026,Day Not Applicable for Calculation,3,2,2,3,4,3,2,-,-,-,1,1,1,0,0,0,2,2,-,-,-,1,4,4,6,-,19 Feb 2026 15:41:35,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222003,1,I-0,09 Mar 2026,Yes,11 Feb 2026,10 Feb 2026,11 Feb 2026,-,-,2,-,2,08 Mar 2026,-,07 Mar 2026,-,06 Mar 2026,-,05 Mar 2026,-,04 Mar 2026,-,03 Mar 2026,Missing Diary,02 Mar 2026,Missing Diary,01 Mar 2026,Missing Diary;Day Not Applicable for Calculation,28 Feb 2026,Missing Diary;Day Not Applicable for Calculation,27 Feb 2026,Missing Diary;Day Not Applicable for Calculation,7,7,6,6,7,-,-,-,-,-,3,2,2,2,2,2,-,-,-,-,-,2,7,7,9,-,22 Mar 2026 18:34:58,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222003,1,I-2,27 Mar 2026,-,-,-,-,-,-,-,-,2,26 Mar 2026,-,25 Mar 2026,-,24 Mar 2026,-,23 Mar 2026,-,22 Mar 2026,-,21 Mar 2026,-,20 Mar 2026,-,19 Mar 2026,Day Not Applicable for Calculation,18 Mar 2026,Day Not Applicable for Calculation,17 Mar 2026,Day Not Applicable for Calculation,7,3,3,3,5,5,5,-,-,-,2,0,0,1,1,1,1,2,-,-,-,1,5,,,-,27 Mar 2026 07:22:31,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222003,1,I-4,08 Apr 2026,-,-,-,-,-,-,-,-,2,07 Apr 2026,-,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,-,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,-,31 Mar 2026,Day Not Applicable for Calculation,30 Mar 2026,Day Not Applicable for Calculation,29 Mar 2026,Day Not Applicable for Calculation,3,3,4,4,5,4,3,-,-,-,2,1,0,0,2,1,1,2,-,-,-,1,5,,,-,08 Apr 2026 07:59:35,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222003,1,I-8,04 May 2026,-,-,-,-,-,-,-,-,2,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,-,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,24 Apr 2026,Missing Diary;Day Not Applicable for Calculation,3,5,3,3,3,2,3,-,-,-,1,0,0,0,0,0,0,0,-,-,-,0,3,,,-,04 May 2026 07:52:47,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222005,1,I-0,09 Apr 2026,Yes,08 Apr 2026,31 Mar 2026,01 Apr 2026,-,-,2,-,2,08 Apr 2026,Endoscopy,07 Apr 2026,-,06 Apr 2026,-,05 Apr 2026,-,04 Apr 2026,-,03 Apr 2026,-,02 Apr 2026,-,01 Apr 2026,Bowel Preparation for Procedure;Day Not Applicable for Calculation,31 Mar 2026,Bowel Preparation for Procedure;Day Not Applicable for Calculation,30 Mar 2026,-,-,3,3,4,3,4,3,-,-,3,1,-,2,2,2,2,2,2,-,-,2,2,5,5,7,-,-,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222005,1,I-2,22 Apr 2026,-,-,-,-,-,-,-,-,2,21 Apr 2026,-,20 Apr 2026,-,19 Apr 2026,-,18 Apr 2026,-,17 Apr 2026,-,16 Apr 2026,-,15 Apr 2026,-,14 Apr 2026,Day Not Applicable for Calculation,13 Apr 2026,Day Not Applicable for Calculation,12 Apr 2026,Day Not Applicable for Calculation,3,3,5,3,2,3,2,-,-,-,1,1,2,2,1,1,1,2,-,-,-,1,4,,,-,22 Apr 2026 14:03:33,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
77242113UCO3001,Adult,Czech Republic,DD5-CZ10022,Petr Hrabak,CZ100222005,1,I-4,05 May 2026,-,-,-,-,-,-,-,-,2,04 May 2026,-,03 May 2026,-,02 May 2026,-,01 May 2026,-,30 Apr 2026,-,29 Apr 2026,-,28 Apr 2026,-,27 Apr 2026,Day Not Applicable for Calculation,26 Apr 2026,Day Not Applicable for Calculation,25 Apr 2026,Day Not Applicable for Calculation,4,2,2,2,2,2,2,-,-,-,1,1,1,1,1,2,1,1,-,-,-,1,4,,,-,05 May 2026 07:30:02,N/A,N/A,N/A,N/A,N/A,N/A
|
||||
|
@@ -0,0 +1,134 @@
|
||||
# Clario Report — 77242113UCO3001
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Verze | 1.2 |
|
||||
| Datum | 2026-05-27 |
|
||||
|
||||
Sada skriptů pro import Clario CSV exportů (MayoScore, MayoDiary) do MongoDB a generování interaktivního Excel reportu pro studii 77242113UCO3001.
|
||||
|
||||
---
|
||||
|
||||
## Přehled
|
||||
|
||||
Skript `create_report.py` generuje Excel report ze dvou MongoDB kolekcí (databáze `Clario`) do adresáře `U:\Dropbox\!!!Days\Downloads Z230\`.
|
||||
|
||||
Název výstupního souboru: `YYYY-MM-DD 77242113UCO3001 Clario Reports.xlsm`
|
||||
|
||||
Soubor je ve formátu `.xlsm` (Excel s makry). Při otevření je nutné **povolit makra**.
|
||||
|
||||
---
|
||||
|
||||
## Spuštění
|
||||
|
||||
```bash
|
||||
python create_report.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Listy
|
||||
|
||||
### MayoScore
|
||||
|
||||
Jeden řádek = jeden záznam (pacient × visit).
|
||||
Zdroj: `Clario.MayoScore` — 37 záznamů, 14 pacientů, 8 center.
|
||||
Řazení: Site → Subject ID → Visit (I-0, I-2, I-4, I-8, I-12, Unscheduled).
|
||||
|
||||
Řádky s Visit = `I-0` a Modified Mayo Score < 5 jsou zobrazeny **červeně tučně**.
|
||||
|
||||
**Interaktivita:** Klik na libovolný řádek automaticky přepne na list EligibleDays a vyfiltruje záznamy pro daného pacienta a visit.
|
||||
|
||||
| Sloupec | Popis |
|
||||
|---|---|
|
||||
| Site | Kód centra |
|
||||
| Subject ID | Číslo pacienta |
|
||||
| Visit | Kód návštěvy |
|
||||
| Visit Date | Datum návštěvy |
|
||||
| Baseline Stool Frequency | Výchozí frekvence stolic |
|
||||
| Central Endoscopy Score | Centrální endoskopické skóre |
|
||||
| PGA Score | Celkové hodnocení lékaře |
|
||||
| Stool Frequency Sub-score | Subscore frekvence stolic |
|
||||
| Rectal Bleeding Sub-score | Subscore rektálního krvácení |
|
||||
| Partial Mayo Score | Parciální Mayo skóre |
|
||||
| Modified Mayo Score | Modifikované Mayo skóre |
|
||||
| Full Mayo Score | Úplné Mayo skóre |
|
||||
|
||||
### MayoDiary
|
||||
|
||||
Jeden řádek = jeden denní záznam deníku pacienta.
|
||||
Zdroj: `Clario.MayoDiary` — 1 098 záznamů, 20 pacientů, 10 center.
|
||||
Řazení: Subject ID → Report Date.
|
||||
|
||||
| Sloupec | Popis |
|
||||
|---|---|
|
||||
| Subject ID | Číslo pacienta |
|
||||
| Report Date | Datum záznamu |
|
||||
| Baseline Stool Count | Výchozí počet stolic |
|
||||
| Stool Frequency | Frekvence stolic daný den |
|
||||
| MAYO050 | Popis rektálního krvácení |
|
||||
| Not Applicable | Záznam nepřipadá v úvahu |
|
||||
| Constipation | Zácpa |
|
||||
| Diarrhea | Průjem |
|
||||
| Irregularity | Nepravidelnost |
|
||||
|
||||
### EligibleDays
|
||||
|
||||
Jeden řádek = jeden eligible day (-1 až -10) z MayoScore, obohacený o data z MayoDiary pro stejného pacienta a datum.
|
||||
Řazení: Subject ID → Visit → Den (-1 první).
|
||||
|
||||
Dny **nezahrnuté** do výpočtu skóre (Included = No): žluté pozadí, šedý font.
|
||||
|
||||
| Sloupec | Popis |
|
||||
|---|---|
|
||||
| Included | Byl den zahrnut do výpočtu Mayo skóre? (Yes/No) |
|
||||
| Subject ID | Číslo pacienta |
|
||||
| Visit | Kód návštěvy |
|
||||
| Visit Date | Datum návštěvy |
|
||||
| Day | Číslo dne (-1 až -10) |
|
||||
| Report Date | Datum daného dne |
|
||||
| Baseline Stool Count | Výchozí počet stolic |
|
||||
| Stool Frequency | Frekvence stolic daný den (z MayoDiary) |
|
||||
| MAYO050 | Popis rektálního krvácení (z MayoDiary) |
|
||||
| Not Applicable | Záznam nepřipadá v úvahu (z MayoDiary) |
|
||||
| Constipation | Zácpa (z MayoDiary) |
|
||||
| Diarrhea | Průjem (z MayoDiary) |
|
||||
| Irregularity | Nepravidelnost (z MayoDiary) |
|
||||
|
||||
---
|
||||
|
||||
## Import dat do MongoDB
|
||||
|
||||
Skript `import_to_mongo.py` načte CSV soubory z adresáře `downloads/` a zapíše je do MongoDB.
|
||||
|
||||
```bash
|
||||
python import_to_mongo.py # všechny CSV z downloads/
|
||||
python import_to_mongo.py downloads/soubor.csv # jeden soubor
|
||||
```
|
||||
|
||||
### Mapování souborů na kolekce
|
||||
|
||||
| Vzor v názvu souboru | Kolekce | Klíč záznamu |
|
||||
|---|---|---|
|
||||
| `MayoDiary` | `Clario.MayoDiary` | Subject ID + Form Number |
|
||||
| `MayoScore` | `Clario.MayoScore` | Participant ID + Visit |
|
||||
|
||||
### Filtr
|
||||
|
||||
Importují se pouze řádky s `Country == "Czech Republic"`.
|
||||
|
||||
### Historie změn
|
||||
|
||||
Při změně datových polí se předchozí verze uloží do pole `history[]` dokumentu spolu s datem změny. Záznamy se nikdy nemažou.
|
||||
|
||||
Po zpracování se soubor přesune do `downloads/Zpracovano/`.
|
||||
|
||||
---
|
||||
|
||||
## MongoDB
|
||||
|
||||
| Parametr | Hodnota |
|
||||
|---|---|
|
||||
| URI | `mongodb://192.168.1.76:27017` |
|
||||
| Databáze | `Clario` |
|
||||
| Kolekce | `Clario.MayoScore`, `Clario.MayoDiary` |
|
||||
@@ -0,0 +1,402 @@
|
||||
"""
|
||||
create_report.py
|
||||
Verze: 1.2
|
||||
Datum: 2026-05-27
|
||||
|
||||
Generuje Excel report (.xlsm) pro studii 77242113UCO3001 z MongoDB databáze Clario.
|
||||
Výstup: U:/Dropbox/!!!Days/Downloads Z230/YYYY-MM-DD 77242113UCO3001 Clario Reports.xlsm
|
||||
|
||||
Listy:
|
||||
MayoScore — jeden řádek = pacient × visit; řádky I-0 s Modified Mayo < 5 červeně tučně
|
||||
MayoDiary — jeden řádek = denní záznam deníku pacienta
|
||||
EligibleDays — jeden řádek = jeden eligible day z MayoScore obohacený o data z MayoDiary;
|
||||
included/excluded flag, excluded dny šedě na žlutém pozadí
|
||||
|
||||
VBA makro (Worksheet_SelectionChange na listu MayoScore):
|
||||
Klik na řádek → automaticky přepne na EligibleDays a vyfiltruje záznamy
|
||||
pro daného pacienta a visit. Vyžaduje povolení maker při otevření souboru.
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
from pymongo import MongoClient
|
||||
from openpyxl import Workbook
|
||||
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
||||
from openpyxl.utils import get_column_letter
|
||||
import xlwings as xw
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Konfigurace
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
MONGO_URI = "mongodb://192.168.1.76:27017"
|
||||
DB_NAME = "Clario"
|
||||
OUTPUT_DIR = Path(r"U:\Dropbox\!!!Days\Downloads Z230")
|
||||
|
||||
VISIT_ORDER = ["I-0", "I-2", "I-4", "I-8", "I-12"]
|
||||
|
||||
COLUMNS_SCORE = [
|
||||
("Site", lambda d: d.get("site", {}).get("name", "")),
|
||||
("Subject ID", lambda d: d.get("subject", {}).get("id", "")),
|
||||
("Visit", lambda d: d["fields"].get("Visit", "")),
|
||||
("Visit Date", lambda d: d["fields"].get("Visit Date", "")),
|
||||
("Baseline Stool Frequency", lambda d: _num(d["fields"].get("Baseline Stool Frequency", ""))),
|
||||
("Central Endoscopy Score", lambda d: _num(d["fields"].get("Central Endoscopy Score", ""))),
|
||||
("PGA Score", lambda d: _num(d["fields"].get("PGA Score", ""))),
|
||||
("Stool Frequency Sub-score", lambda d: _num(d["fields"].get("Stool Frequency Sub-score", ""))),
|
||||
("Rectal Bleeding Sub-score", lambda d: _num(d["fields"].get("Rectal Bleeding Sub-score", ""))),
|
||||
("Partial Mayo Score", lambda d: _num(d["fields"].get("Partial Mayo Score", ""))),
|
||||
("Modified Mayo Score", lambda d: _num(d["fields"].get("Modified Mayo Score", ""))),
|
||||
("Full Mayo Score", lambda d: _num(d["fields"].get("Full Mayo Score", ""))),
|
||||
]
|
||||
|
||||
COLUMNS_DIARY = [
|
||||
("Subject ID", lambda d: d.get("subject", {}).get("id", "")),
|
||||
("Report Date", lambda d: d["fields"].get("Report Date", "")),
|
||||
("Baseline Stool Count", lambda d: _num(d["fields"].get("Baseline Stool Count", ""))),
|
||||
("Stool Frequency", lambda d: _num(d["fields"].get("Stool Frequency", ""))),
|
||||
("MAYO050", lambda d: d["fields"].get("MAYO050", "")),
|
||||
("Not Applicable", lambda d: d["fields"].get("Not Applicable", "")),
|
||||
("Constipation", lambda d: d["fields"].get("Constipation", "")),
|
||||
("Diarrhea", lambda d: d["fields"].get("Diarrhea", "")),
|
||||
("Irregularity", lambda d: d["fields"].get("Irregularity", "")),
|
||||
]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _num(value):
|
||||
"""Převede číselný string na int, jinak vrátí původní hodnotu nebo None."""
|
||||
if value == "" or value is None:
|
||||
return None
|
||||
try:
|
||||
return int(value)
|
||||
except (ValueError, TypeError):
|
||||
try:
|
||||
return float(value)
|
||||
except (ValueError, TypeError):
|
||||
return value
|
||||
|
||||
|
||||
def _visit_sort_key(doc):
|
||||
visit = doc["fields"].get("Visit", "")
|
||||
try:
|
||||
idx = VISIT_ORDER.index(visit)
|
||||
except ValueError:
|
||||
idx = len(VISIT_ORDER)
|
||||
return (doc.get("site", {}).get("name", ""), doc.get("subject", {}).get("id", ""), idx, visit)
|
||||
|
||||
|
||||
def _iso_to_date(value):
|
||||
"""ISO string → Python date pro Excel."""
|
||||
if not isinstance(value, str):
|
||||
return value
|
||||
try:
|
||||
return datetime.fromisoformat(value).date()
|
||||
except ValueError:
|
||||
return value
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Styly
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
HEADER_FILL = PatternFill("solid", fgColor="1F497D")
|
||||
HEADER_FONT = Font(bold=True, color="FFFFFF", size=10)
|
||||
CELL_FONT = Font(size=10)
|
||||
ALIGN_CTR = Alignment(horizontal="center", vertical="center", wrap_text=False)
|
||||
ALIGN_LEFT = Alignment(horizontal="left", vertical="center")
|
||||
|
||||
THIN = Side(style="thin", color="BFBFBF")
|
||||
BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
|
||||
|
||||
# zebra
|
||||
FILL_ODD = PatternFill("solid", fgColor="FFFFFF")
|
||||
FILL_EVEN = PatternFill("solid", fgColor="EBF1DE")
|
||||
|
||||
SCORE_COLS = {"Partial Mayo Score", "Modified Mayo Score", "Full Mayo Score"}
|
||||
SCORE_FILL = PatternFill("solid", fgColor="FFC7CE") # červená pro skóre ≥ 5 (placeholder — nepoužíváme podmíněné formátování)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Sestavení sheetu
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _build_sheet(ws, docs, columns, date_cols, center_cols, col_widths, row_font_fn=None):
|
||||
headers = [c[0] for c in columns]
|
||||
|
||||
for col_idx, header in enumerate(headers, 1):
|
||||
cell = ws.cell(row=1, column=col_idx, value=header)
|
||||
cell.font = HEADER_FONT
|
||||
cell.fill = HEADER_FILL
|
||||
cell.alignment = ALIGN_CTR
|
||||
cell.border = BORDER
|
||||
ws.row_dimensions[1].height = 28
|
||||
|
||||
for row_idx, doc in enumerate(docs, 2):
|
||||
fill = FILL_EVEN if row_idx % 2 == 0 else FILL_ODD
|
||||
font = row_font_fn(doc) if row_font_fn else CELL_FONT
|
||||
for col_idx, (col_name, getter) in enumerate(columns, 1):
|
||||
value = getter(doc)
|
||||
if col_name in date_cols and isinstance(value, str):
|
||||
value = _iso_to_date(value)
|
||||
cell = ws.cell(row=row_idx, column=col_idx, value=value)
|
||||
cell.font = font
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
cell.alignment = ALIGN_CTR if col_name in center_cols else ALIGN_LEFT
|
||||
|
||||
for col_idx, (col_name, _) in enumerate(columns, 1):
|
||||
ws.column_dimensions[get_column_letter(col_idx)].width = col_widths.get(col_name, 14)
|
||||
|
||||
for col_name in date_cols:
|
||||
if col_name in headers:
|
||||
letter = get_column_letter(headers.index(col_name) + 1)
|
||||
for row_idx in range(2, len(docs) + 2):
|
||||
ws[f"{letter}{row_idx}"].number_format = "DD-MMM-YYYY"
|
||||
|
||||
ws.freeze_panes = "A2"
|
||||
ws.auto_filter.ref = f"A1:{get_column_letter(len(headers))}1"
|
||||
|
||||
|
||||
def _score_row_font(doc):
|
||||
visit = doc["fields"].get("Visit", "")
|
||||
try:
|
||||
mod_mayo = int(doc["fields"].get("Modified Mayo Score", ""))
|
||||
except (ValueError, TypeError):
|
||||
mod_mayo = None
|
||||
if visit == "I-0" and mod_mayo is not None and mod_mayo < 5:
|
||||
return Font(size=10, bold=True, color="FF0000")
|
||||
return CELL_FONT
|
||||
|
||||
|
||||
def build_mayo_score_sheet(ws, docs):
|
||||
_build_sheet(
|
||||
ws, docs, COLUMNS_SCORE,
|
||||
date_cols={"Visit Date"},
|
||||
center_cols={"Visit", "Central Endoscopy Score", "PGA Score",
|
||||
"Stool Frequency Sub-score", "Rectal Bleeding Sub-score",
|
||||
"Partial Mayo Score", "Modified Mayo Score", "Full Mayo Score",
|
||||
"Baseline Stool Frequency"},
|
||||
col_widths={
|
||||
"Site": 18, "Subject ID": 16, "Visit": 12, "Visit Date": 14,
|
||||
"Baseline Stool Frequency": 14, "Central Endoscopy Score": 14,
|
||||
"PGA Score": 10, "Stool Frequency Sub-score": 14,
|
||||
"Rectal Bleeding Sub-score": 14, "Partial Mayo Score": 14,
|
||||
"Modified Mayo Score": 14, "Full Mayo Score": 13,
|
||||
},
|
||||
row_font_fn=_score_row_font,
|
||||
)
|
||||
|
||||
|
||||
def build_mayo_diary_sheet(ws, docs):
|
||||
_build_sheet(
|
||||
ws, docs, COLUMNS_DIARY,
|
||||
date_cols={"Report Date"},
|
||||
center_cols={"Baseline Stool Count", "Stool Frequency", "Not Applicable",
|
||||
"Constipation", "Diarrhea", "Irregularity"},
|
||||
col_widths={
|
||||
"Subject ID": 16, "Report Date": 14, "Baseline Stool Count": 14,
|
||||
"Stool Frequency": 14, "MAYO050": 48, "Not Applicable": 14,
|
||||
"Constipation": 14, "Diarrhea": 12, "Irregularity": 14,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def build_eligible_days_sheet(ws, score_docs, diary_docs):
|
||||
# Lookup diary records by (subject_id, date_part YYYY-MM-DD)
|
||||
diary_lookup: dict[tuple, dict] = {}
|
||||
for d in diary_docs:
|
||||
subj = d.get("subject", {}).get("id", "")
|
||||
date_iso = d["fields"].get("Report Date", "")
|
||||
date_part = date_iso[:10] if date_iso else ""
|
||||
if subj and date_part:
|
||||
diary_lookup[(subj, date_part)] = d
|
||||
|
||||
headers = [
|
||||
"Included", "Subject ID", "Visit", "Visit Date", "Day",
|
||||
"Report Date", "Baseline Stool Count", "Stool Frequency",
|
||||
"MAYO050", "Not Applicable", "Constipation", "Diarrhea", "Irregularity",
|
||||
]
|
||||
col_widths = {
|
||||
"Included": 10, "Subject ID": 16, "Visit": 10, "Visit Date": 14, "Day": 8,
|
||||
"Report Date": 14, "Baseline Stool Count": 14, "Stool Frequency": 14,
|
||||
"MAYO050": 48, "Not Applicable": 14, "Constipation": 14,
|
||||
"Diarrhea": 12, "Irregularity": 14,
|
||||
}
|
||||
center_cols = {"Included", "Visit", "Day", "Baseline Stool Count", "Stool Frequency",
|
||||
"Not Applicable", "Constipation", "Diarrhea", "Irregularity"}
|
||||
date_cols = {"Visit Date", "Report Date"}
|
||||
no_fill = PatternFill("solid", fgColor="FFF2CC") # žlutá pro excluded dny
|
||||
|
||||
for col_idx, header in enumerate(headers, 1):
|
||||
cell = ws.cell(row=1, column=col_idx, value=header)
|
||||
cell.font = HEADER_FONT
|
||||
cell.fill = HEADER_FILL
|
||||
cell.alignment = ALIGN_CTR
|
||||
cell.border = BORDER
|
||||
ws.row_dimensions[1].height = 28
|
||||
|
||||
row_idx = 2
|
||||
for score_doc in score_docs:
|
||||
subj = score_doc.get("subject", {}).get("id", "")
|
||||
visit = score_doc["fields"].get("Visit", "")
|
||||
visit_date = score_doc["fields"].get("Visit Date", "")
|
||||
|
||||
for n in range(1, 11):
|
||||
day_date_iso = score_doc["fields"].get(f"Eligible Day (-{n})")
|
||||
if not day_date_iso or day_date_iso == "-":
|
||||
continue
|
||||
date_part = day_date_iso[:10]
|
||||
excl_reason = score_doc["fields"].get(f"Day (-{n}) Excluded Reason(s)", "")
|
||||
included = "No" if excl_reason and excl_reason != "-" else "Yes"
|
||||
|
||||
diary = diary_lookup.get((subj, date_part), {})
|
||||
df = diary.get("fields", {})
|
||||
|
||||
fill = no_fill if included == "No" else (FILL_EVEN if row_idx % 2 == 0 else FILL_ODD)
|
||||
font = Font(size=10, color="808080") if included == "No" else CELL_FONT
|
||||
|
||||
values = [
|
||||
included,
|
||||
subj,
|
||||
visit,
|
||||
_iso_to_date(visit_date) if isinstance(visit_date, str) else visit_date,
|
||||
f"-{n}",
|
||||
_iso_to_date(day_date_iso),
|
||||
_num(df.get("Baseline Stool Count", "")),
|
||||
_num(df.get("Stool Frequency", "")),
|
||||
df.get("MAYO050", ""),
|
||||
df.get("Not Applicable", ""),
|
||||
df.get("Constipation", ""),
|
||||
df.get("Diarrhea", ""),
|
||||
df.get("Irregularity", ""),
|
||||
]
|
||||
|
||||
for col_idx, (header, value) in enumerate(zip(headers, values), 1):
|
||||
cell = ws.cell(row=row_idx, column=col_idx, value=value)
|
||||
cell.font = font
|
||||
cell.fill = fill
|
||||
cell.border = BORDER
|
||||
if header in date_cols:
|
||||
cell.number_format = "DD-MMM-YYYY"
|
||||
cell.alignment = ALIGN_CTR if header in center_cols else ALIGN_LEFT
|
||||
|
||||
row_idx += 1
|
||||
|
||||
for col_idx, header in enumerate(headers, 1):
|
||||
ws.column_dimensions[get_column_letter(col_idx)].width = col_widths.get(header, 14)
|
||||
|
||||
ws.freeze_panes = "A2"
|
||||
ws.auto_filter.ref = f"A1:{get_column_letter(len(headers))}1"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Main
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def main():
|
||||
client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000)
|
||||
client.admin.command("ping")
|
||||
db = client[DB_NAME]
|
||||
|
||||
score_docs = list(db["Clario.MayoScore"].find({}))
|
||||
diary_docs = list(db["Clario.MayoDiary"].find({}))
|
||||
client.close()
|
||||
|
||||
score_docs.sort(key=_visit_sort_key)
|
||||
diary_docs.sort(key=lambda d: (
|
||||
d.get("subject", {}).get("id", ""),
|
||||
d["fields"].get("Report Date", ""),
|
||||
))
|
||||
|
||||
wb = Workbook()
|
||||
ws_score = wb.active
|
||||
ws_score.title = "MayoScore"
|
||||
build_mayo_score_sheet(ws_score, score_docs)
|
||||
|
||||
ws_diary = wb.create_sheet("MayoDiary")
|
||||
build_mayo_diary_sheet(ws_diary, diary_docs)
|
||||
|
||||
ws_days = wb.create_sheet("EligibleDays")
|
||||
build_eligible_days_sheet(ws_days, score_docs, diary_docs)
|
||||
|
||||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
today = datetime.now().strftime("%Y-%m-%d")
|
||||
filename = f"{today} 77242113UCO3001 Clario Reports.xlsx"
|
||||
output_path = OUTPUT_DIR / filename
|
||||
|
||||
# Uložit jako .xlsx nejdřív, pak přepsat na .xlsm přes xlwings + injektovat VBA
|
||||
xlsx_path = output_path.with_suffix(".xlsx")
|
||||
xlsm_path = output_path.with_suffix(".xlsm")
|
||||
wb.save(str(xlsx_path))
|
||||
|
||||
inject_vba(xlsx_path, xlsm_path)
|
||||
xlsx_path.unlink(missing_ok=True)
|
||||
|
||||
print(f"Uloženo: {xlsm_path}")
|
||||
print(f"MayoScore: {len(score_docs)} záznamů")
|
||||
print(f"MayoDiary: {len(diary_docs)} záznamů")
|
||||
print(f"EligibleDays: generováno z {len(score_docs)} score záznamů")
|
||||
|
||||
|
||||
def inject_vba(xlsx_path: Path, xlsm_path: Path) -> None:
|
||||
vba_code = '''\
|
||||
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
|
||||
If Target.Row < 2 Or Target.Column < 1 Then Exit Sub
|
||||
If Target.Rows.Count > 1 Then Exit Sub
|
||||
|
||||
Dim subjectId As String
|
||||
Dim visit As String
|
||||
subjectId = CStr(Me.Cells(Target.Row, 2).Value)
|
||||
visit = CStr(Me.Cells(Target.Row, 3).Value)
|
||||
|
||||
If subjectId = "" Or visit = "" Then Exit Sub
|
||||
|
||||
Dim ws As Worksheet
|
||||
On Error Resume Next
|
||||
Set ws = ThisWorkbook.Sheets("EligibleDays")
|
||||
On Error GoTo 0
|
||||
If ws Is Nothing Then Exit Sub
|
||||
|
||||
Application.ScreenUpdating = False
|
||||
|
||||
ws.AutoFilterMode = False
|
||||
ws.Range("A1").AutoFilter
|
||||
ws.Range("A1").AutoFilter Field:=2, Criteria1:=subjectId
|
||||
ws.Range("A1").AutoFilter Field:=3, Criteria1:=visit
|
||||
|
||||
ws.Activate
|
||||
ws.Range("A2").Select
|
||||
|
||||
Application.ScreenUpdating = True
|
||||
End Sub
|
||||
'''
|
||||
|
||||
app = xw.App(visible=False)
|
||||
try:
|
||||
wb = app.books.open(str(xlsx_path))
|
||||
# Najdi VBComponent odpovídající listu "MayoScore" podle tab názvu
|
||||
vb_comp = None
|
||||
for comp in wb.api.VBProject.VBComponents:
|
||||
if comp.Type == 100: # xlSheet
|
||||
try:
|
||||
if comp.Properties("Name").Value == "MayoScore":
|
||||
vb_comp = comp
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
if vb_comp is None:
|
||||
# fallback: první sheet (Sheet1)
|
||||
vb_comp = wb.api.VBProject.VBComponents("Sheet1")
|
||||
vb_comp.CodeModule.AddFromString(vba_code)
|
||||
wb.api.SaveAs(str(xlsm_path), FileFormat=52) # 52 = xlOpenXMLWorkbookMacroEnabled
|
||||
wb.close()
|
||||
finally:
|
||||
app.quit()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,264 @@
|
||||
"""
|
||||
import_to_mongo.py
|
||||
Verze: 1.0
|
||||
Datum: 2026-05-27
|
||||
|
||||
Import Clario CSV do MongoDB (databáze: Clario).
|
||||
|
||||
Kolekce: Clario.MayoDiary / Clario.MayoScore (dle názvu souboru)
|
||||
Filtr: pouze řádky s Country == "Czech Republic"
|
||||
Klíč: MayoDiary → Subject ID + Form Number
|
||||
MayoScore → Participant ID + Visit
|
||||
Historie: při změně fields se stará verze uloží do pole history[]
|
||||
Po importu přesune zpracované CSV do downloads/Zpracovano/
|
||||
|
||||
Použití:
|
||||
python import_to_mongo.py # importuje všechny CSV z downloads/
|
||||
python import_to_mongo.py downloads/konkretni.csv # jeden soubor
|
||||
"""
|
||||
|
||||
import csv
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
from pymongo import MongoClient, ASCENDING
|
||||
|
||||
MONGO_URI = "mongodb://192.168.1.76:27017"
|
||||
DB_NAME = "Clario"
|
||||
DOWNLOADS_DIR = Path(__file__).parent / "downloads"
|
||||
PROCESSED_DIR = DOWNLOADS_DIR / "Zpracovano"
|
||||
|
||||
COUNTRY_FILTER = "Czech Republic"
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Konfigurace kolekcí
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
COLLECTION_CONFIG = {
|
||||
"MayoDiary": {
|
||||
"collection": "Clario.MayoDiary",
|
||||
"subject_col": "Subject ID",
|
||||
"key_cols": ("Subject ID", "Form Number"),
|
||||
},
|
||||
"MayoScore": {
|
||||
"collection": "Clario.MayoScore",
|
||||
"subject_col": "Participant ID",
|
||||
"key_cols": ("Participant ID", "Visit"),
|
||||
},
|
||||
}
|
||||
|
||||
DATE_FORMATS = [
|
||||
"%d-%b-%Y ",
|
||||
"%d-%b-%Y",
|
||||
"%d-%b-%Y %H:%M:%S",
|
||||
"%d %b %Y %H:%M:%S",
|
||||
"%d %b %Y %H:%M:%S:%f",
|
||||
"%d %b %Y",
|
||||
"%d %B %Y",
|
||||
"%Y%m%d %H:%M:%S.%f",
|
||||
"%Y-%m-%d %H:%M:%S",
|
||||
"%m/%d/%Y %I:%M:%S %p",
|
||||
]
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Helpers
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def clean_colname(name: str) -> str:
|
||||
"""Odstraní BOM a okolní uvozovky/mezery z názvu sloupce."""
|
||||
return name.lstrip("").strip().strip('"')
|
||||
|
||||
|
||||
def parse_date(value: str) -> str | None:
|
||||
v = value.strip()
|
||||
for fmt in DATE_FORMATS:
|
||||
try:
|
||||
dt = datetime.strptime(v, fmt.strip())
|
||||
return dt.replace(tzinfo=timezone.utc).isoformat()
|
||||
except ValueError:
|
||||
continue
|
||||
return None
|
||||
|
||||
|
||||
def extract_snapshot_date(filename: str) -> str:
|
||||
match = re.match(r"(\d{4}-\d{2}-\d{2})", Path(filename).name)
|
||||
return match.group(1) if match else datetime.now().strftime("%Y-%m-%d")
|
||||
|
||||
|
||||
def detect_collection_type(filename: str) -> str | None:
|
||||
"""Vrátí klíč do COLLECTION_CONFIG nebo None."""
|
||||
stem = Path(filename).stem
|
||||
for key in COLLECTION_CONFIG:
|
||||
if key in stem:
|
||||
return key
|
||||
return None
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# CSV → dokument
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def map_row(row: dict, col_type: str) -> dict:
|
||||
cfg = COLLECTION_CONFIG[col_type]
|
||||
doc: dict = {}
|
||||
fields: dict = {}
|
||||
|
||||
cleaned = {clean_colname(k): v.strip() if v else "" for k, v in row.items()}
|
||||
|
||||
subject_col = cfg["subject_col"]
|
||||
doc["subject"] = {"id": cleaned.get(subject_col, "")}
|
||||
doc["site"] = {"name": cleaned.get("Site", "")}
|
||||
doc["country"] = cleaned.get("Country", "")
|
||||
doc["study"] = cleaned.get("Protocol", "")
|
||||
|
||||
key_parts = [cleaned.get(c, "") for c in cfg["key_cols"]]
|
||||
doc["recordKey"] = "_".join(key_parts)
|
||||
|
||||
skip_top = {"Protocol", "Country", "Site", subject_col}
|
||||
for col, value in cleaned.items():
|
||||
if col in skip_top:
|
||||
continue
|
||||
if not value or value == "-":
|
||||
continue
|
||||
parsed = parse_date(value)
|
||||
fields[col] = parsed if parsed else value
|
||||
|
||||
doc["fields"] = fields
|
||||
return doc
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Import jednoho souboru
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def import_file(csv_path: str, db) -> dict:
|
||||
filename = Path(csv_path).name
|
||||
col_type = detect_collection_type(filename)
|
||||
if col_type is None:
|
||||
print(f" Preskakuji (neznamy typ): {filename}")
|
||||
return {"skipped": True}
|
||||
|
||||
cfg = COLLECTION_CONFIG[col_type]
|
||||
col_name = cfg["collection"]
|
||||
snapshot_date = extract_snapshot_date(filename)
|
||||
collection = db[col_name]
|
||||
|
||||
inserted = changed = unchanged = filtered_out = 0
|
||||
|
||||
with open(csv_path, encoding="utf-8-sig", newline="") as f:
|
||||
reader = csv.DictReader(f, delimiter=",", quotechar='"')
|
||||
|
||||
for row in reader:
|
||||
cleaned_row = {clean_colname(k): v for k, v in row.items()}
|
||||
country = cleaned_row.get("Country", "").strip()
|
||||
if country != COUNTRY_FILTER:
|
||||
filtered_out += 1
|
||||
continue
|
||||
|
||||
doc = map_row(row, col_type)
|
||||
record_key = doc.get("recordKey")
|
||||
if not record_key:
|
||||
continue
|
||||
|
||||
doc["sourceFile"] = filename
|
||||
|
||||
existing = collection.find_one({"recordKey": record_key})
|
||||
|
||||
if existing is None:
|
||||
doc["firstSeen"] = snapshot_date
|
||||
doc["lastSeen"] = snapshot_date
|
||||
doc["history"] = []
|
||||
collection.insert_one(doc)
|
||||
inserted += 1
|
||||
|
||||
elif existing.get("fields") != doc["fields"]:
|
||||
old_entry = {
|
||||
"date": existing.get("lastSeen", snapshot_date),
|
||||
"fields": existing["fields"],
|
||||
}
|
||||
update_doc = {k: v for k, v in doc.items()}
|
||||
update_doc["lastSeen"] = snapshot_date
|
||||
collection.update_one(
|
||||
{"_id": existing["_id"]},
|
||||
{
|
||||
"$push": {"history": old_entry},
|
||||
"$set": update_doc,
|
||||
},
|
||||
)
|
||||
changed += 1
|
||||
|
||||
else:
|
||||
collection.update_one(
|
||||
{"_id": existing["_id"]},
|
||||
{"$set": {"lastSeen": snapshot_date, "sourceFile": filename}},
|
||||
)
|
||||
unchanged += 1
|
||||
|
||||
collection.create_index([("recordKey", ASCENDING)], unique=True)
|
||||
collection.create_index([("subject.id", ASCENDING)])
|
||||
collection.create_index([("site.name", ASCENDING)])
|
||||
|
||||
stats = {
|
||||
"collection": col_name,
|
||||
"snapshot": snapshot_date,
|
||||
"inserted": inserted,
|
||||
"changed": changed,
|
||||
"unchanged": unchanged,
|
||||
"filtered_out": filtered_out,
|
||||
}
|
||||
print(f" {col_name} [{snapshot_date}]: +{inserted} new, ~{changed} changed, ={unchanged} same, -{filtered_out} non-CZ")
|
||||
return stats
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Main
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def main():
|
||||
paths: list[Path] = []
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
for arg in sys.argv[1:]:
|
||||
p = Path(arg)
|
||||
if p.is_file():
|
||||
paths.append(p)
|
||||
else:
|
||||
print(f"Soubor nenalezen: {arg}")
|
||||
else:
|
||||
paths = sorted(DOWNLOADS_DIR.glob("*.csv"))
|
||||
|
||||
if not paths:
|
||||
print("Zadne CSV soubory k importu.")
|
||||
return
|
||||
|
||||
print(f"Nalezeno {len(paths)} souboru.\n")
|
||||
|
||||
client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=5000)
|
||||
client.admin.command("ping")
|
||||
db = client[DB_NAME]
|
||||
|
||||
PROCESSED_DIR.mkdir(exist_ok=True)
|
||||
|
||||
total = {"inserted": 0, "changed": 0, "unchanged": 0}
|
||||
|
||||
for csv_path in paths:
|
||||
print(f"Import: {csv_path.name}")
|
||||
stats = import_file(str(csv_path), db)
|
||||
if not stats.get("skipped"):
|
||||
for k in total:
|
||||
total[k] += stats.get(k, 0)
|
||||
|
||||
dest = PROCESSED_DIR / csv_path.name
|
||||
shutil.move(str(csv_path), str(dest))
|
||||
print(f" -> presunut do Zpracovano/")
|
||||
|
||||
client.close()
|
||||
|
||||
print(f"\nCelkem: +{total['inserted']} new, ~{total['changed']} changed, ={total['unchanged']} same")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user