diff --git a/data/10_BinhThuan_RIIW.xls.xlsx b/data-old/10_BinhThuan_RIIW.xls.xlsx similarity index 100% rename from data/10_BinhThuan_RIIW.xls.xlsx rename to data-old/10_BinhThuan_RIIW.xls.xlsx diff --git a/data/10_Ca_Mau_BKXT.xls.xlsx b/data-old/10_Ca_Mau_BKXT.xls.xlsx similarity index 100% rename from data/10_Ca_Mau_BKXT.xls.xlsx rename to data-old/10_Ca_Mau_BKXT.xls.xlsx diff --git a/data/10_LamDong_GNFT.xls.xlsx b/data-old/10_LamDong_GNFT.xls.xlsx similarity index 100% rename from data/10_LamDong_GNFT.xls.xlsx rename to data-old/10_LamDong_GNFT.xls.xlsx diff --git a/data/10_Soc_Trang_XCGJ.xls.xlsx b/data-old/10_Soc_Trang_XCGJ.xls.xlsx similarity index 100% rename from data/10_Soc_Trang_XCGJ.xls.xlsx rename to data-old/10_Soc_Trang_XCGJ.xls.xlsx diff --git a/data/11_BinhDuong_RYQL.xls.xlsx b/data-old/11_BinhDuong_RYQL.xls.xlsx similarity index 100% rename from data/11_BinhDuong_RYQL.xls.xlsx rename to data-old/11_BinhDuong_RYQL.xls.xlsx diff --git a/data/11_LaoCai_GMSU.xls.xlsx b/data-old/11_LaoCai_GMSU.xls.xlsx similarity index 100% rename from data/11_LaoCai_GMSU.xls.xlsx rename to data-old/11_LaoCai_GMSU.xls.xlsx diff --git a/data/12_BenTre_DKWF.xls.xlsx b/data-old/12_BenTre_DKWF.xls.xlsx similarity index 100% rename from data/12_BenTre_DKWF.xls.xlsx rename to data-old/12_BenTre_DKWF.xls.xlsx diff --git a/data/12_LongAn_ZZUK.xls.xlsx b/data-old/12_LongAn_ZZUK.xls.xlsx similarity index 100% rename from data/12_LongAn_ZZUK.xls.xlsx rename to data-old/12_LongAn_ZZUK.xls.xlsx diff --git a/data/13_NamDinh_ESEL.xls.xlsx b/data-old/13_NamDinh_ESEL.xls.xlsx similarity index 100% rename from data/13_NamDinh_ESEL.xls.xlsx rename to data-old/13_NamDinh_ESEL.xls.xlsx diff --git a/data/13_TraVinh_LKUJ.xls.xlsx b/data-old/13_TraVinh_LKUJ.xls.xlsx similarity index 100% rename from data/13_TraVinh_LKUJ.xls.xlsx rename to data-old/13_TraVinh_LKUJ.xls.xlsx diff --git a/data/14_NgheAn_BSLY.xls.xlsx b/data-old/14_NgheAn_BSLY.xls.xlsx similarity index 100% rename from data/14_NgheAn_BSLY.xls.xlsx rename to data-old/14_NgheAn_BSLY.xls.xlsx diff --git a/data/15_PhuTho_ABWQ.xls.xlsx b/data-old/15_PhuTho_ABWQ.xls.xlsx similarity index 100% rename from data/15_PhuTho_ABWQ.xls.xlsx rename to data-old/15_PhuTho_ABWQ.xls.xlsx diff --git a/data/16_QuangBinh_KGEU.xls.xlsx b/data-old/16_QuangBinh_KGEU.xls.xlsx similarity index 100% rename from data/16_QuangBinh_KGEU.xls.xlsx rename to data-old/16_QuangBinh_KGEU.xls.xlsx diff --git a/data/17_QuangNam_AMTK.xls.xlsx b/data-old/17_QuangNam_AMTK.xls.xlsx similarity index 100% rename from data/17_QuangNam_AMTK.xls.xlsx rename to data-old/17_QuangNam_AMTK.xls.xlsx diff --git a/data/18_QuangNgai_KOFP.xls.xlsx b/data-old/18_QuangNgai_KOFP.xls.xlsx similarity index 100% rename from data/18_QuangNgai_KOFP.xls.xlsx rename to data-old/18_QuangNgai_KOFP.xls.xlsx diff --git a/data/19_QuangTri_OMZF.xls.xlsx b/data-old/19_QuangTri_OMZF.xls.xlsx similarity index 100% rename from data/19_QuangTri_OMZF.xls.xlsx rename to data-old/19_QuangTri_OMZF.xls.xlsx diff --git a/data/1_BaRia_VungTau_HJKG.xls.xlsx b/data-old/1_BaRia_VungTau_HJKG.xls.xlsx similarity index 100% rename from data/1_BaRia_VungTau_HJKG.xls.xlsx rename to data-old/1_BaRia_VungTau_HJKG.xls.xlsx diff --git a/data/1_Da_Nang_AHWJ.xls.xlsx b/data-old/1_Da_Nang_AHWJ.xls.xlsx similarity index 100% rename from data/1_Da_Nang_AHWJ.xls.xlsx rename to data-old/1_Da_Nang_AHWJ.xls.xlsx diff --git a/data/1_Ha_Noi_CVXG.xls.xlsx b/data-old/1_Ha_Noi_CVXG.xls.xlsx similarity index 100% rename from data/1_Ha_Noi_CVXG.xls.xlsx rename to data-old/1_Ha_Noi_CVXG.xls.xlsx diff --git a/data/1_Son_La_JIDP.xls.xlsx b/data-old/1_Son_La_JIDP.xls.xlsx similarity index 100% rename from data/1_Son_La_JIDP.xls.xlsx rename to data-old/1_Son_La_JIDP.xls.xlsx diff --git a/data/1_TuyenQuang_JBYF.xls.xlsx b/data-old/1_TuyenQuang_JBYF.xls.xlsx similarity index 100% rename from data/1_TuyenQuang_JBYF.xls.xlsx rename to data-old/1_TuyenQuang_JBYF.xls.xlsx diff --git a/data/20_TayNinh_ILFA.xls.xlsx b/data-old/20_TayNinh_ILFA.xls.xlsx similarity index 100% rename from data/20_TayNinh_ILFA.xls.xlsx rename to data-old/20_TayNinh_ILFA.xls.xlsx diff --git a/data/21_ThaiBinh_FTVG.xls.xlsx b/data-old/21_ThaiBinh_FTVG.xls.xlsx similarity index 100% rename from data/21_ThaiBinh_FTVG.xls.xlsx rename to data-old/21_ThaiBinh_FTVG.xls.xlsx diff --git a/data/22_ThaiNguyen_TLTW.xls.xlsx b/data-old/22_ThaiNguyen_TLTW.xls.xlsx similarity index 100% rename from data/22_ThaiNguyen_TLTW.xls.xlsx rename to data-old/22_ThaiNguyen_TLTW.xls.xlsx diff --git a/data/23_HaiPhong_HXBV.xls.xlsx b/data-old/23_HaiPhong_HXBV.xls.xlsx similarity index 100% rename from data/23_HaiPhong_HXBV.xls.xlsx rename to data-old/23_HaiPhong_HXBV.xls.xlsx diff --git a/data/24_HCM_XULN.xls.xlsx b/data-old/24_HCM_XULN.xls.xlsx similarity index 100% rename from data/24_HCM_XULN.xls.xlsx rename to data-old/24_HCM_XULN.xls.xlsx diff --git a/data/2_BacKan_GFVQ.xls.xlsx b/data-old/2_BacKan_GFVQ.xls.xlsx similarity index 100% rename from data/2_BacKan_GFVQ.xls.xlsx rename to data-old/2_BacKan_GFVQ.xls.xlsx diff --git a/data/2_Ha_Giang_QNCM.xls.xlsx b/data-old/2_Ha_Giang_QNCM.xls.xlsx similarity index 100% rename from data/2_Ha_Giang_QNCM.xls.xlsx rename to data-old/2_Ha_Giang_QNCM.xls.xlsx diff --git a/data/2_Ninh_Thuan_VHLY.xls.xlsx b/data-old/2_Ninh_Thuan_VHLY.xls.xlsx similarity index 100% rename from data/2_Ninh_Thuan_VHLY.xls.xlsx rename to data-old/2_Ninh_Thuan_VHLY.xls.xlsx diff --git a/data/2_Thanh_Hoa_AUFV.xls.xlsx b/data-old/2_Thanh_Hoa_AUFV.xls.xlsx similarity index 100% rename from data/2_Thanh_Hoa_AUFV.xls.xlsx rename to data-old/2_Thanh_Hoa_AUFV.xls.xlsx diff --git a/data/2_VinhPhuc_GUDK.xls.xlsx b/data-old/2_VinhPhuc_GUDK.xls.xlsx similarity index 100% rename from data/2_VinhPhuc_GUDK.xls.xlsx rename to data-old/2_VinhPhuc_GUDK.xls.xlsx diff --git a/data/3_BacGiang_TOIF.xls.xlsx b/data-old/3_BacGiang_TOIF.xls.xlsx similarity index 100% rename from data/3_BacGiang_TOIF.xls.xlsx rename to data-old/3_BacGiang_TOIF.xls.xlsx diff --git a/data/3_BinhPhuoc_YFMU.xls.xlsx b/data-old/3_BinhPhuoc_YFMU.xls.xlsx similarity index 100% rename from data/3_BinhPhuoc_YFMU.xls.xlsx rename to data-old/3_BinhPhuoc_YFMU.xls.xlsx diff --git a/data/3_Cao_Bang_CIEY.xls.xlsx b/data-old/3_Cao_Bang_CIEY.xls.xlsx similarity index 100% rename from data/3_Cao_Bang_CIEY.xls.xlsx rename to data-old/3_Cao_Bang_CIEY.xls.xlsx diff --git a/data/3_Dong_Thap_GSXQ.xls.xlsx b/data-old/3_Dong_Thap_GSXQ.xls.xlsx similarity index 100% rename from data/3_Dong_Thap_GSXQ.xls.xlsx rename to data-old/3_Dong_Thap_GSXQ.xls.xlsx diff --git a/data/3_Thua_Thien_Hue_HMDB.xls.xlsx b/data-old/3_Thua_Thien_Hue_HMDB.xls.xlsx similarity index 100% rename from data/3_Thua_Thien_Hue_HMDB.xls.xlsx rename to data-old/3_Thua_Thien_Hue_HMDB.xls.xlsx diff --git a/data/4_An_Giang_JNOS.xls.xlsx b/data-old/4_An_Giang_JNOS.xls.xlsx similarity index 100% rename from data/4_An_Giang_JNOS.xls.xlsx rename to data-old/4_An_Giang_JNOS.xls.xlsx diff --git a/data/4_BacNinh_STLR.xls.xlsx b/data-old/4_BacNinh_STLR.xls.xlsx similarity index 100% rename from data/4_BacNinh_STLR.xls.xlsx rename to data-old/4_BacNinh_STLR.xls.xlsx diff --git a/data/4_Binh_Dinh_WWZW.xls.xlsx b/data-old/4_Binh_Dinh_WWZW.xls.xlsx similarity index 100% rename from data/4_Binh_Dinh_WWZW.xls.xlsx rename to data-old/4_Binh_Dinh_WWZW.xls.xlsx diff --git a/data/4_DienBien_SOJG.xls.xlsx b/data-old/4_DienBien_SOJG.xls.xlsx similarity index 100% rename from data/4_DienBien_SOJG.xls.xlsx rename to data-old/4_DienBien_SOJG.xls.xlsx diff --git a/data/4_Lang_Son_NYQL.xls.xlsx b/data-old/4_Lang_Son_NYQL.xls.xlsx similarity index 100% rename from data/4_Lang_Son_NYQL.xls.xlsx rename to data-old/4_Lang_Son_NYQL.xls.xlsx diff --git a/data/5_Bac_Lieu_XEKH.xls.xlsx b/data-old/5_Bac_Lieu_XEKH.xls.xlsx similarity index 100% rename from data/5_Bac_Lieu_XEKH.xls.xlsx rename to data-old/5_Bac_Lieu_XEKH.xls.xlsx diff --git a/data/5_Gia_Lai_ABZI.xls.xlsx b/data-old/5_Gia_Lai_ABZI.xls.xlsx similarity index 100% rename from data/5_Gia_Lai_ABZI.xls.xlsx rename to data-old/5_Gia_Lai_ABZI.xls.xlsx diff --git a/data/5_HaiDuong_WWWG.xls.xlsx b/data-old/5_HaiDuong_WWWG.xls.xlsx similarity index 100% rename from data/5_HaiDuong_WWWG.xls.xlsx rename to data-old/5_HaiDuong_WWWG.xls.xlsx diff --git a/data/5_Hanam_QGJS.xls.xlsx b/data-old/5_Hanam_QGJS.xls.xlsx similarity index 100% rename from data/5_Hanam_QGJS.xls.xlsx rename to data-old/5_Hanam_QGJS.xls.xlsx diff --git a/data/5_Yen_Bai_FAQR.xls.xlsx b/data-old/5_Yen_Bai_FAQR.xls.xlsx similarity index 100% rename from data/5_Yen_Bai_FAQR.xls.xlsx rename to data-old/5_Yen_Bai_FAQR.xls.xlsx diff --git a/data/6_Dong_Nai_WOTM.xls.xlsx b/data-old/6_Dong_Nai_WOTM.xls.xlsx similarity index 100% rename from data/6_Dong_Nai_WOTM.xls.xlsx rename to data-old/6_Dong_Nai_WOTM.xls.xlsx diff --git a/data/6_Hau_Giang_KWDM.xls.xlsx b/data-old/6_Hau_Giang_KWDM.xls.xlsx similarity index 100% rename from data/6_Hau_Giang_KWDM.xls.xlsx rename to data-old/6_Hau_Giang_KWDM.xls.xlsx diff --git a/data/6_HoaBinh_TPZY.xls.xlsx b/data-old/6_HoaBinh_TPZY.xls.xlsx similarity index 100% rename from data/6_HoaBinh_TPZY.xls.xlsx rename to data-old/6_HoaBinh_TPZY.xls.xlsx diff --git a/data/6_NinhBinh_IGFT.xls.xlsx b/data-old/6_NinhBinh_IGFT.xls.xlsx similarity index 100% rename from data/6_NinhBinh_IGFT.xls.xlsx rename to data-old/6_NinhBinh_IGFT.xls.xlsx diff --git a/data/6_Quang_Ninh_DQCJ.xls.xlsx b/data-old/6_Quang_Ninh_DQCJ.xls.xlsx similarity index 100% rename from data/6_Quang_Ninh_DQCJ.xls.xlsx rename to data-old/6_Quang_Ninh_DQCJ.xls.xlsx diff --git a/data/7_HaTinh_DDHD.xls.xlsx b/data-old/7_HaTinh_DDHD.xls.xlsx similarity index 100% rename from data/7_HaTinh_DDHD.xls.xlsx rename to data-old/7_HaTinh_DDHD.xls.xlsx diff --git a/data/7_HungYen_LTIK.xls.xlsx b/data-old/7_HungYen_LTIK.xls.xlsx similarity index 100% rename from data/7_HungYen_LTIK.xls.xlsx rename to data-old/7_HungYen_LTIK.xls.xlsx diff --git a/data/7_Kon_Tum_RSLR.xls.xlsx b/data-old/7_Kon_Tum_RSLR.xls.xlsx similarity index 100% rename from data/7_Kon_Tum_RSLR.xls.xlsx rename to data-old/7_Kon_Tum_RSLR.xls.xlsx diff --git a/data/7_Tien_Giang_EFHX.xls.xlsx b/data-old/7_Tien_Giang_EFHX.xls.xlsx similarity index 100% rename from data/7_Tien_Giang_EFHX.xls.xlsx rename to data-old/7_Tien_Giang_EFHX.xls.xlsx diff --git a/data/8_Can_Tho_RQZM.xls.xlsx b/data-old/8_Can_Tho_RQZM.xls.xlsx similarity index 100% rename from data/8_Can_Tho_RQZM.xls.xlsx rename to data-old/8_Can_Tho_RQZM.xls.xlsx diff --git a/data/8_Dak_Lak_YKPR.xls.xlsx b/data-old/8_Dak_Lak_YKPR.xls.xlsx similarity index 100% rename from data/8_Dak_Lak_YKPR.xls.xlsx rename to data-old/8_Dak_Lak_YKPR.xls.xlsx diff --git a/data/8_KienGiang_OTOB.xls.xlsx b/data-old/8_KienGiang_OTOB.xls.xlsx similarity index 100% rename from data/8_KienGiang_OTOB.xls.xlsx rename to data-old/8_KienGiang_OTOB.xls.xlsx diff --git a/data/8_PhuYen_OGIM.xls.xlsx b/data-old/8_PhuYen_OGIM.xls.xlsx similarity index 100% rename from data/8_PhuYen_OGIM.xls.xlsx rename to data-old/8_PhuYen_OGIM.xls.xlsx diff --git a/data/9_DakNong_FBOP.xls.xlsx b/data-old/9_DakNong_FBOP.xls.xlsx similarity index 100% rename from data/9_DakNong_FBOP.xls.xlsx rename to data-old/9_DakNong_FBOP.xls.xlsx diff --git a/data/9_Khanh_Hoa_KPKQ.xls.xlsx b/data-old/9_Khanh_Hoa_KPKQ.xls.xlsx similarity index 100% rename from data/9_Khanh_Hoa_KPKQ.xls.xlsx rename to data-old/9_Khanh_Hoa_KPKQ.xls.xlsx diff --git a/data/9_LaiChau_ALKN.xls.xlsx b/data-old/9_LaiChau_ALKN.xls.xlsx similarity index 100% rename from data/9_LaiChau_ALKN.xls.xlsx rename to data-old/9_LaiChau_ALKN.xls.xlsx diff --git a/data/9_Vinh_Long_OLWA.xls.xlsx b/data-old/9_Vinh_Long_OLWA.xls.xlsx similarity index 100% rename from data/9_Vinh_Long_OLWA.xls.xlsx rename to data-old/9_Vinh_Long_OLWA.xls.xlsx diff --git a/data/an-giang.xls b/data/an-giang.xls new file mode 100644 index 0000000..2bd6d99 Binary files /dev/null and b/data/an-giang.xls differ diff --git a/data/ba-ria-vung-tau.xls b/data/ba-ria-vung-tau.xls new file mode 100644 index 0000000..16d5efb Binary files /dev/null and b/data/ba-ria-vung-tau.xls differ diff --git a/data/bac-giang.xls b/data/bac-giang.xls new file mode 100644 index 0000000..b66cbc0 Binary files /dev/null and b/data/bac-giang.xls differ diff --git a/data/bac-kan.xls b/data/bac-kan.xls new file mode 100644 index 0000000..48a8b24 Binary files /dev/null and b/data/bac-kan.xls differ diff --git a/data/bac-lieu.xls b/data/bac-lieu.xls new file mode 100644 index 0000000..3e03b4e Binary files /dev/null and b/data/bac-lieu.xls differ diff --git a/data/bac-ninh.xls b/data/bac-ninh.xls new file mode 100644 index 0000000..20a2733 Binary files /dev/null and b/data/bac-ninh.xls differ diff --git a/data/ben-tre.xls b/data/ben-tre.xls new file mode 100644 index 0000000..feea32b Binary files /dev/null and b/data/ben-tre.xls differ diff --git a/data/binh-dinh.xls b/data/binh-dinh.xls new file mode 100644 index 0000000..c023763 Binary files /dev/null and b/data/binh-dinh.xls differ diff --git a/data/binh-duong.xls b/data/binh-duong.xls new file mode 100644 index 0000000..9039585 Binary files /dev/null and b/data/binh-duong.xls differ diff --git a/data/binh-phuoc.xls b/data/binh-phuoc.xls new file mode 100644 index 0000000..7de6d84 Binary files /dev/null and b/data/binh-phuoc.xls differ diff --git a/data/binh-thuan.xls b/data/binh-thuan.xls new file mode 100644 index 0000000..cb245f5 Binary files /dev/null and b/data/binh-thuan.xls differ diff --git a/data/ca-mau.xls b/data/ca-mau.xls new file mode 100644 index 0000000..f101539 Binary files /dev/null and b/data/ca-mau.xls differ diff --git a/data/can-tho.xls b/data/can-tho.xls new file mode 100644 index 0000000..35a0d15 Binary files /dev/null and b/data/can-tho.xls differ diff --git a/data/cao-bang.xls b/data/cao-bang.xls new file mode 100644 index 0000000..942598a Binary files /dev/null and b/data/cao-bang.xls differ diff --git a/data/da-nang.xls b/data/da-nang.xls new file mode 100644 index 0000000..4aa326d Binary files /dev/null and b/data/da-nang.xls differ diff --git a/data/dak-lak.xls b/data/dak-lak.xls new file mode 100644 index 0000000..4e10353 Binary files /dev/null and b/data/dak-lak.xls differ diff --git a/data/dak-nong.xls b/data/dak-nong.xls new file mode 100644 index 0000000..5a0ac74 Binary files /dev/null and b/data/dak-nong.xls differ diff --git a/data/dien-bien.xls b/data/dien-bien.xls new file mode 100644 index 0000000..762f77c Binary files /dev/null and b/data/dien-bien.xls differ diff --git a/data/dong-nai.xls b/data/dong-nai.xls new file mode 100644 index 0000000..ed35d26 Binary files /dev/null and b/data/dong-nai.xls differ diff --git a/data/dong-thap.xls b/data/dong-thap.xls new file mode 100644 index 0000000..22a825a Binary files /dev/null and b/data/dong-thap.xls differ diff --git a/data/gia-lai.xls b/data/gia-lai.xls new file mode 100644 index 0000000..a2e1e7c Binary files /dev/null and b/data/gia-lai.xls differ diff --git a/data/ha-giang.xls b/data/ha-giang.xls new file mode 100644 index 0000000..4f5849c Binary files /dev/null and b/data/ha-giang.xls differ diff --git a/data/ha-nam.xls b/data/ha-nam.xls new file mode 100644 index 0000000..c78e7c9 Binary files /dev/null and b/data/ha-nam.xls differ diff --git a/data/ha-noi.xls b/data/ha-noi.xls new file mode 100644 index 0000000..d8ca43d Binary files /dev/null and b/data/ha-noi.xls differ diff --git a/data/ha-tinh.xls b/data/ha-tinh.xls new file mode 100644 index 0000000..8bebed5 Binary files /dev/null and b/data/ha-tinh.xls differ diff --git a/data/hai-duong.xls b/data/hai-duong.xls new file mode 100644 index 0000000..95bdf51 Binary files /dev/null and b/data/hai-duong.xls differ diff --git a/data/hai-phong.xls b/data/hai-phong.xls new file mode 100644 index 0000000..6fd2fc3 Binary files /dev/null and b/data/hai-phong.xls differ diff --git a/data/hau-giang.xls b/data/hau-giang.xls new file mode 100644 index 0000000..4e69fa1 Binary files /dev/null and b/data/hau-giang.xls differ diff --git a/data/ho-chi-minh.xls b/data/ho-chi-minh.xls new file mode 100644 index 0000000..9994477 Binary files /dev/null and b/data/ho-chi-minh.xls differ diff --git a/data/hoa-binh.xls b/data/hoa-binh.xls new file mode 100644 index 0000000..c034aec Binary files /dev/null and b/data/hoa-binh.xls differ diff --git a/data/hung-yen.xls b/data/hung-yen.xls new file mode 100644 index 0000000..d5fe12f Binary files /dev/null and b/data/hung-yen.xls differ diff --git a/data/khanh-hoa.xls b/data/khanh-hoa.xls new file mode 100644 index 0000000..69c11b7 Binary files /dev/null and b/data/khanh-hoa.xls differ diff --git a/data/kien-giang.xls b/data/kien-giang.xls new file mode 100644 index 0000000..f9ff88d Binary files /dev/null and b/data/kien-giang.xls differ diff --git a/data/kon-tum.xls b/data/kon-tum.xls new file mode 100644 index 0000000..781f5c8 Binary files /dev/null and b/data/kon-tum.xls differ diff --git a/data/lai-chau.xls b/data/lai-chau.xls new file mode 100644 index 0000000..c54cafe Binary files /dev/null and b/data/lai-chau.xls differ diff --git a/data/lam-dong.xls b/data/lam-dong.xls new file mode 100644 index 0000000..83d5183 Binary files /dev/null and b/data/lam-dong.xls differ diff --git a/data/lang-son.xls b/data/lang-son.xls new file mode 100644 index 0000000..09a6e67 Binary files /dev/null and b/data/lang-son.xls differ diff --git a/data/lao-cai.xls b/data/lao-cai.xls new file mode 100644 index 0000000..0a140ab Binary files /dev/null and b/data/lao-cai.xls differ diff --git a/data/long-an.xls b/data/long-an.xls new file mode 100644 index 0000000..0521d03 Binary files /dev/null and b/data/long-an.xls differ diff --git a/data/nam-dinh.xls b/data/nam-dinh.xls new file mode 100644 index 0000000..2341bbc Binary files /dev/null and b/data/nam-dinh.xls differ diff --git a/data/nghe-an.xls b/data/nghe-an.xls new file mode 100644 index 0000000..a861b4d Binary files /dev/null and b/data/nghe-an.xls differ diff --git a/data/ninh-binh.xls b/data/ninh-binh.xls new file mode 100644 index 0000000..0527547 Binary files /dev/null and b/data/ninh-binh.xls differ diff --git a/data/ninh-thuan.xls b/data/ninh-thuan.xls new file mode 100644 index 0000000..0055b6a Binary files /dev/null and b/data/ninh-thuan.xls differ diff --git a/data/phu-tho.xls b/data/phu-tho.xls new file mode 100644 index 0000000..cd09b6c Binary files /dev/null and b/data/phu-tho.xls differ diff --git a/data/phu-yen.xls b/data/phu-yen.xls new file mode 100644 index 0000000..77ad508 Binary files /dev/null and b/data/phu-yen.xls differ diff --git a/data/quang-binh.xls b/data/quang-binh.xls new file mode 100644 index 0000000..9ead57f Binary files /dev/null and b/data/quang-binh.xls differ diff --git a/data/quang-nam.xls b/data/quang-nam.xls new file mode 100644 index 0000000..a98711f Binary files /dev/null and b/data/quang-nam.xls differ diff --git a/data/quang-ngai.xls b/data/quang-ngai.xls new file mode 100644 index 0000000..b3caaa8 Binary files /dev/null and b/data/quang-ngai.xls differ diff --git a/data/quang-ninh.xls b/data/quang-ninh.xls new file mode 100644 index 0000000..420eccf Binary files /dev/null and b/data/quang-ninh.xls differ diff --git a/data/quang-tri.xls b/data/quang-tri.xls new file mode 100644 index 0000000..f6a5533 Binary files /dev/null and b/data/quang-tri.xls differ diff --git a/data/soc-trang.xls b/data/soc-trang.xls new file mode 100644 index 0000000..1b28fc7 Binary files /dev/null and b/data/soc-trang.xls differ diff --git a/data/son-la.xls b/data/son-la.xls new file mode 100644 index 0000000..93c6962 Binary files /dev/null and b/data/son-la.xls differ diff --git a/data/tay-ninh.xls b/data/tay-ninh.xls new file mode 100644 index 0000000..1b2f9d5 Binary files /dev/null and b/data/tay-ninh.xls differ diff --git a/data/thai-binh.xls b/data/thai-binh.xls new file mode 100644 index 0000000..d073bb8 Binary files /dev/null and b/data/thai-binh.xls differ diff --git a/data/thai-nguyen.xls b/data/thai-nguyen.xls new file mode 100644 index 0000000..d7fdf30 Binary files /dev/null and b/data/thai-nguyen.xls differ diff --git a/data/thanh-hoa.xls b/data/thanh-hoa.xls new file mode 100644 index 0000000..de89c45 Binary files /dev/null and b/data/thanh-hoa.xls differ diff --git a/data/thua-thien-hue.xls b/data/thua-thien-hue.xls new file mode 100644 index 0000000..41c7c4a Binary files /dev/null and b/data/thua-thien-hue.xls differ diff --git a/data/tien-giang.xls b/data/tien-giang.xls new file mode 100644 index 0000000..00b1ebb Binary files /dev/null and b/data/tien-giang.xls differ diff --git a/data/tra-vinh.xls b/data/tra-vinh.xls new file mode 100644 index 0000000..b65eea9 Binary files /dev/null and b/data/tra-vinh.xls differ diff --git a/data/tuyen-quang.xls b/data/tuyen-quang.xls new file mode 100644 index 0000000..2e4ed83 Binary files /dev/null and b/data/tuyen-quang.xls differ diff --git a/data/vinh-long.xls b/data/vinh-long.xls new file mode 100644 index 0000000..2d5cafe Binary files /dev/null and b/data/vinh-long.xls differ diff --git a/data/vinh-phuc.xls b/data/vinh-phuc.xls new file mode 100644 index 0000000..05b60ed Binary files /dev/null and b/data/vinh-phuc.xls differ diff --git a/data/yen-bai.xls b/data/yen-bai.xls new file mode 100644 index 0000000..5d53f48 Binary files /dev/null and b/data/yen-bai.xls differ diff --git a/scripts/build-database.js b/scripts/build-database.js index 70c22b5..0fec9b1 100644 --- a/scripts/build-database.js +++ b/scripts/build-database.js @@ -37,14 +37,13 @@ function toAscii(str) { .toLowerCase(); } -// Collect all .xlsx files directly under data/ +// Collect all .xls and .xlsx files directly under data/ function collectExcelFiles() { const files = []; for (const f of fs.readdirSync(RAW_DIR)) { const full = path.join(RAW_DIR, f); - if (fs.statSync(full).isFile() && f.endsWith(".xlsx")) { - files.push(full); - } + if (!fs.statSync(full).isFile()) continue; + if (f.endsWith(".xls") || f.endsWith(".xlsx")) files.push(full); } return files; } @@ -127,22 +126,30 @@ function main() { try { const wb = XLSX.readFile(file); - const ws = wb.Sheets[wb.SheetNames[0]]; - const rows = XLSX.utils.sheet_to_json(ws, { header: 1 }); - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - - // Skip header rows - if (i === 0 && isHeaderRow(row)) continue; + // Iterate ALL sheets — .xls files over 65,536 rows (Hà Nội, HCM) split + // into continuation sheets that we must not miss. + const allRows = []; + for (const sheetName of wb.SheetNames) { + const rows = XLSX.utils.sheet_to_json(wb.Sheets[sheetName], { + header: 1, + }); + for (let i = 0; i < rows.length; i++) { + // Skip header row on every sheet (continuation sheets may repeat it, + // or start directly with data — isHeaderRow handles both) + if (i === 0 && isHeaderRow(rows[i])) continue; + allRows.push(rows[i]); + } + } + for (let i = 0; i < allRows.length; i++) { + const row = allRows[i]; try { - const hoTen = String(row[0] || "").trim(); - const ngaySinh = String(row[1] || "").trim(); - const soBaoDanh = String(row[2] || "").trim(); - const diemThi = String(row[3] || ""); + const hoTen = String(row?.[0] || "").trim(); + const ngaySinh = String(row?.[1] || "").trim(); + const soBaoDanh = String(row?.[2] || "").trim(); + const diemThi = String(row?.[3] || ""); - // Validate: soBaoDanh should be numeric-like + // Skip truly empty rows (common tail padding in .xls) if (!soBaoDanh || !hoTen) continue; const scores = parseScores(diemThi); diff --git a/scripts/crawl-baotintuc.js b/scripts/crawl-baotintuc.js new file mode 100644 index 0000000..7fb8036 --- /dev/null +++ b/scripts/crawl-baotintuc.js @@ -0,0 +1,137 @@ +// Crawl Excel score files for all 63 provinces from baotintuc.vn article: +// https://baotintuc.vn/tuyen-sinh/tra-cuu-diem-thi-thpt-2017-cua-63-tinh-thanh-pho-tren-baotintucvn-20170706073512672.htm +// Saves to data/.xls (63 files). Idempotent: skips already-downloaded files. +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const OUT_DIR = path.join(__dirname, "..", "data"); + +const LINKS = [ + ["An Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/17/57/Angiang.xls"], + ["Bac Lieu", "https://cdnmedia.baotintuc.vn/2017/07/06/17/59/Baclieu.xls"], + ["Ba Ria - Vung Tau", "https://cdnmedia.baotintuc.vn/2017/07/06/08/17/1BaRiaVungTau.xls"], + ["Bac Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/09/33/BacGiang.xls"], + ["Bac Kan", "https://cdnmedia.baotintuc.vn/2017/07/06/08/27/BacKan.xls"], + ["Bac Ninh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/33/BacNinh.xls"], + ["Ben Tre", "https://cdnmedia.baotintuc.vn/2017/07/06/09/34/BenTre.xls"], + ["Binh Duong", "https://cdnmedia.baotintuc.vn/2017/07/06/09/34/BinhDuong.xls"], + ["Binh Thuan", "https://cdnmedia.baotintuc.vn/2017/07/06/09/35/BinhThuan.xls"], + ["Binh Phuoc", "https://cdnmedia.baotintuc.vn/2017/07/06/09/09/BinhPhuoc.xls"], + ["Binh Dinh", "https://cdnmedia.baotintuc.vn/2017/07/06/13/05/Binhdinh.xls"], + ["Ca Mau", "https://cdnmedia.baotintuc.vn/2017/07/06/13/05/Camau.xls"], + ["Cao Bang", "https://cdnmedia.baotintuc.vn/2017/07/06/18/02/Caobang.xls"], + ["Can Tho", "https://cdnmedia.baotintuc.vn/2017/07/06/13/07/Cantho.xls"], + ["Da Nang", "https://cdnmedia.baotintuc.vn/2017/07/06/18/03/Danang.xls"], + ["Dak Nong", "https://cdnmedia.baotintuc.vn/2017/07/06/09/35/DakNong.xls"], + ["Dak Lak", "https://cdnmedia.baotintuc.vn/2017/07/06/18/02/Daklak.xls"], + ["Dong Nai", "https://cdnmedia.baotintuc.vn/2017/07/06/13/08/dongnai.xls"], + ["Dong Thap", "https://cdnmedia.baotintuc.vn/2017/07/06/17/59/Dongthap.xls"], + ["Dien Bien", "https://cdnmedia.baotintuc.vn/2017/07/06/09/08/DienBien.xls"], + ["Gia Lai", "https://cdnmedia.baotintuc.vn/2017/07/06/13/09/Gia-Lai.xls"], + ["Ha Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/18/18/Hagiang.xls"], + ["Ha Noi", "https://cdnmedia.baotintuc.vn/2017/07/07/08/16/HaNoi.xls"], + ["Ha Nam", "https://cdnmedia.baotintuc.vn/2017/07/06/09/07/Hanam.xls"], + ["Ha Tinh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/36/HaTinh.xls"], + ["Hai Phong", "https://cdnmedia.baotintuc.vn/2017/07/06/08/18/23HaiPhong.xls"], + ["Hai Duong", "https://cdnmedia.baotintuc.vn/2017/07/06/09/36/HaiDuong.xls"], + ["Hau Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/18/00/Haugiang.xls"], + ["Ho Chi Minh", "https://cdnmedia.baotintuc.vn/2017/07/06/08/26/HCM.xls"], + ["Hoa Binh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/06/HoaBinh.xls"], + ["Hung Yen", "https://cdnmedia.baotintuc.vn/2017/07/06/08/25/HungYen.xls"], + ["Khanh Hoa", "https://cdnmedia.baotintuc.vn/2017/07/06/18/04/Khanhhoa.xls"], + ["Kien Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/08/28/KienGiang.xls"], + ["Kon Tum", "https://cdnmedia.baotintuc.vn/2017/07/06/18/05/KonTum.xls"], + ["Nam Dinh", "https://cdnmedia.baotintuc.vn/2017/07/06/07/55/13NamDinh.xls"], + ["Nghe An", "https://cdnmedia.baotintuc.vn/2017/07/06/07/55/14NgheAn.xls"], + ["Ninh Binh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/37/NinhBinh.xls"], + ["Ninh Thuan", "https://cdnmedia.baotintuc.vn/2017/07/06/18/00/Ninhthuan.xls"], + ["Lao Cai", "https://cdnmedia.baotintuc.vn/2017/07/06/08/52/11LaoCai.xls"], + ["Lai Chau", "https://cdnmedia.baotintuc.vn/2017/07/06/13/33/LaiChau.xls"], + ["Lang Son", "https://cdnmedia.baotintuc.vn/2017/07/06/18/05/Langson.xls"], + ["Lam Dong", "https://cdnmedia.baotintuc.vn/2017/07/06/09/00/LamDong.xls"], + ["Long An", "https://cdnmedia.baotintuc.vn/2017/07/06/08/53/12LongAn.xls"], + ["Quang Binh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/23/QuangBinh.xls"], + ["Quang Nam", "https://cdnmedia.baotintuc.vn/2017/07/06/09/24/QuangNam.xls"], + ["Quang Ninh", "https://cdnmedia.baotintuc.vn/2017/07/06/18/06/Quangninh.xls"], + ["Quang Ngai", "https://cdnmedia.baotintuc.vn/2017/07/06/09/24/QuangNgai.xls"], + ["Quang Tri", "https://cdnmedia.baotintuc.vn/2017/07/06/09/25/QuangTri.xls"], + ["Phu Tho", "https://cdnmedia.baotintuc.vn/2017/07/06/09/23/PhuTho.xls"], + ["Phu Yen", "https://cdnmedia.baotintuc.vn/2017/07/06/09/38/PhuYen.xls"], + ["Son La", "https://cdnmedia.baotintuc.vn/2017/07/06/18/01/Sonla.xls"], + ["Soc Trang", "https://cdnmedia.baotintuc.vn/2017/07/06/18/06/Soctrang.xls"], + ["Tay Ninh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/26/TayNinh.xls"], + ["Thai Binh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/09/ThaiBinh.xls"], + ["Thai Nguyen", "https://cdnmedia.baotintuc.vn/2017/07/06/13/35/ThaiNguyen.xls"], + ["Thanh Hoa", "https://cdnmedia.baotintuc.vn/2017/07/06/13/10/thanhoa.xls"], + ["Tra Vinh", "https://cdnmedia.baotintuc.vn/2017/07/06/09/38/TraVinh.xls"], + ["Thua Thien Hue", "https://cdnmedia.baotintuc.vn/2017/07/06/13/10/thuathienhue.xls"], + ["Tien Giang", "https://cdnmedia.baotintuc.vn/2017/07/06/13/11/tiengiang.xls"], + ["Tuyen Quang", "https://cdnmedia.baotintuc.vn/2017/07/06/09/39/TuyenQuang.xls"], + ["Vinh Phuc", "https://cdnmedia.baotintuc.vn/2017/07/06/09/40/VinhPhuc.xls"], + ["Vinh Long", "https://cdnmedia.baotintuc.vn/2017/07/06/13/13/vinhlong.xls"], + ["Yen Bai", "https://cdnmedia.baotintuc.vn/2017/07/06/18/07/Yenbai.xls"], +]; + +function slug(name) { + return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""); +} + +async function downloadOne(name, url) { + const outPath = path.join(OUT_DIR, `${slug(name)}.xls`); + if (fs.existsSync(outPath) && fs.statSync(outPath).size > 0) { + return { name, url, outPath, status: "skip", size: fs.statSync(outPath).size }; + } + const res = await fetch(url, { + headers: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36", + Referer: + "https://baotintuc.vn/tuyen-sinh/tra-cuu-diem-thi-thpt-2017-cua-63-tinh-thanh-pho-tren-baotintucvn-20170706073512672.htm", + }, + }); + if (!res.ok) { + return { name, url, outPath, status: "fail", httpStatus: res.status }; + } + const buf = Buffer.from(await res.arrayBuffer()); + fs.writeFileSync(outPath, buf); + return { name, url, outPath, status: "ok", size: buf.length }; +} + +async function main() { + fs.mkdirSync(OUT_DIR, { recursive: true }); + console.log(`Downloading ${LINKS.length} files to ${OUT_DIR}...`); + + const CONCURRENCY = 6; + const results = []; + let i = 0; + async function worker() { + while (i < LINKS.length) { + const idx = i++; + const [name, url] = LINKS[idx]; + try { + const r = await downloadOne(name, url); + results.push(r); + const tag = r.status === "ok" ? "✓" : r.status === "skip" ? "·" : "✗"; + const sz = r.size ? `${(r.size / 1024).toFixed(0)} KB` : ""; + console.log(` ${tag} [${idx + 1}/${LINKS.length}] ${name.padEnd(20)} ${sz} ${r.status === "fail" ? "HTTP " + r.httpStatus : ""}`); + } catch (err) { + console.log(` ✗ [${idx + 1}/${LINKS.length}] ${name}: ${err.message}`); + results.push({ name, url, status: "error", message: err.message }); + } + } + } + await Promise.all(Array.from({ length: CONCURRENCY }, worker)); + + const ok = results.filter((r) => r.status === "ok").length; + const skip = results.filter((r) => r.status === "skip").length; + const fail = results.filter((r) => r.status === "fail" || r.status === "error"); + console.log(`\nDone. ok=${ok} skip=${skip} fail=${fail.length}`); + if (fail.length) { + console.log("Failed:", fail.map((f) => f.name).join(", ")); + process.exit(1); + } +} + +main(); diff --git a/scripts/diff-datasets.js b/scripts/diff-datasets.js new file mode 100644 index 0000000..6df1d20 --- /dev/null +++ b/scripts/diff-datasets.js @@ -0,0 +1,113 @@ +// Compare new DB (public/thptqg2017.db) vs backup old DB (backup/thptqg2017.old.db) +import Database from "better-sqlite3"; + +const NEW = new Database("public/thptqg2017.db", { readonly: true }); +const OLD = new Database("backup/thptqg2017.old.db", { readonly: true }); + +const SCORE_COLS = [ + "toan", "ngu_van", "vat_ly", "hoa_hoc", "sinh_hoc", "khtn", + "lich_su", "dia_ly", "gdcd", "khxh", + "tieng_anh", "tieng_phap", "tieng_nga", "tieng_trung", +]; + +// Old schema may lack some newer columns — detect and project a subset +const oldCols = new Set( + OLD.prepare("PRAGMA table_info(student)").all().map((c) => c.name), +); +const commonCols = SCORE_COLS.filter((c) => oldCols.has(c)); + +const newCount = NEW.prepare("SELECT COUNT(*) c FROM student").get().c; +const oldCount = OLD.prepare("SELECT COUNT(*) c FROM student").get().c; +console.log(`\n=== Row counts ===`); +console.log(` new: ${newCount}`); +console.log(` old: ${oldCount}`); +console.log(` diff: ${newCount - oldCount >= 0 ? "+" : ""}${newCount - oldCount}`); + +// Build SBD sets (memory: 861k strings ~50 MB, fine) +const newSbd = new Set( + NEW.prepare("SELECT so_bao_danh FROM student").all().map((r) => r.so_bao_danh), +); +const oldSbd = new Set( + OLD.prepare("SELECT so_bao_danh FROM student").all().map((r) => r.so_bao_danh), +); + +let newOnly = 0, oldOnly = 0, common = 0; +for (const s of newSbd) (oldSbd.has(s) ? common++ : newOnly++); +for (const s of oldSbd) if (!newSbd.has(s)) oldOnly++; + +console.log(`\n=== SBD membership ===`); +console.log(` new-only (added): ${newOnly}`); +console.log(` old-only (removed): ${oldOnly}`); +console.log(` common: ${common}`); + +// Sample 5 new-only SBDs to peek +const sampleNewOnly = []; +for (const s of newSbd) { + if (!oldSbd.has(s)) sampleNewOnly.push(s); + if (sampleNewOnly.length >= 5) break; +} +if (sampleNewOnly.length) { + const rows = NEW.prepare( + `SELECT so_bao_danh, ho_ten FROM student WHERE so_bao_danh IN (${sampleNewOnly.map(() => "?").join(",")})`, + ).all(...sampleNewOnly); + console.log(` sample new-only rows:`); + rows.forEach((r) => console.log(` ${r.so_bao_danh} ${r.ho_ten}`)); +} + +// Score comparison on common SBDs +console.log(`\n=== Score comparison (common SBDs) ===`); +console.log(` columns compared: ${commonCols.join(", ")}`); + +const newStmt = NEW.prepare( + `SELECT so_bao_danh, ${commonCols.join(",")} FROM student`, +); +const oldStmt = OLD.prepare( + `SELECT so_bao_danh, ${commonCols.join(",")} FROM student`, +); + +// Build old map +const oldMap = new Map(); +for (const r of oldStmt.iterate()) oldMap.set(r.so_bao_danh, r); + +let identical = 0, + differ = 0; +const colChanges = Object.fromEntries(commonCols.map((c) => [c, { changed: 0, newNull: 0, oldNull: 0 }])); +const sampleDiffs = []; + +for (const nr of newStmt.iterate()) { + const or = oldMap.get(nr.so_bao_danh); + if (!or) continue; + let rowDiffers = false; + const rowChanges = []; + for (const c of commonCols) { + const a = nr[c], b = or[c]; + if (a === b) continue; + // treat very-close floats as equal (xlsx may emit 5.5 vs 5.50) + if (a !== null && b !== null && Math.abs(a - b) < 1e-9) continue; + rowDiffers = true; + colChanges[c].changed++; + if (a === null) colChanges[c].newNull++; + if (b === null) colChanges[c].oldNull++; + rowChanges.push(`${c}: ${b} → ${a}`); + } + if (rowDiffers) { + differ++; + if (sampleDiffs.length < 5) sampleDiffs.push({ sbd: nr.so_bao_danh, changes: rowChanges }); + } else { + identical++; + } +} + +console.log(` identical: ${identical}`); +console.log(` differing: ${differ}`); +console.log(` per-column changes:`); +for (const [c, info] of Object.entries(colChanges)) { + if (info.changed === 0) continue; + console.log(` ${c.padEnd(14)} changed=${info.changed} (new-null=${info.newNull}, old-null=${info.oldNull})`); +} +if (sampleDiffs.length) { + console.log(` sample diffs:`); + sampleDiffs.forEach((d) => { + console.log(` SBD ${d.sbd}: ${d.changes.slice(0, 4).join("; ")}${d.changes.length > 4 ? " ..." : ""}`); + }); +}