Showing posts with label regex. Show all posts
Showing posts with label regex. Show all posts

Friday, November 20, 2015

Penggunaan Regular Expression dalam Seleksi Tenaga Humas Kementrian Komunikasi dan Informatika

Tutorial Kali ini akan membahas salah satu kegunaan Regular Expression dalam melakukan Capturing Group. Jadi dengan teknik Capturing Group maka kita bisa mengekstrak elemen tertentu dari String yang match dengan Reguler Expression ketimbang mengambil secara keseluruhan. Dalam Bahasa Java, capturing group ini dihitung berdasarkan berapa jumlah kurung dari sebelah kanan pada Pattern Regex-nya. Misalkan kita memiliki Pattern seperti berikut ap(ple|a) dan diberikan sebuah string yang akan di-match apple, maka group(1) itu adalah akan menghasilkan string ple.

Nah, kebetulan kemarin diadakan seleksi tenaga Humas dari Kementrian Komunikasi dan Informatika yang konon gaji yang diberikan adalah sebesar 18 juta sebulan. Saya tertarik ikutan mendaftar walaupun ujung-ujungnya gagal di tahap seleksi berkas. Ternyata dalam tahap seleksi berkas ini peserta yang ikutan mendaftar sebanyak 1779 orang dari seluruh provinsi yang berada di NKRI. Nah, saya melihat ternyata ada ketidakseimbangan distribusi peserta antar provinsi yang terlihat dari jumlah peserta berdasarkan KTP nya. Di dalam nomor peserta yang akan mengikuti seleksi berkas tersebut, digunakan identitas berdasarkan KTP. Dan kita sudah tahu bagaimana aturan menentukan asal daerah seseorang berdasarkan nomor NIK pada KTP-nya.

Menurut pengalaman saya sendiri waktu melakukan pendaftaran online di situs Panselnas, memang agak sulit untuk bisa login. Di samping itu, bisa jadi informasi tentang lowongan ini tidak banyak diketahui oleh orang-orang. Bayangkan, untuk daerah Sulawesi Tengah saja hanya ada 7 orang peserta termasuk saya sendiri.

Jadi sama seperti tutorial yang saya sudah buat sebelumnya tentang bagaimana mengextract tex pada file pdf dan memfilternya dengan regex, maka tutorial kali ini lebih menekankan pada teknik Capturing Group nya. Dokument pdf yang akan diextract bisa dilihat di sini.

Saya menggunakan listing berikut untuk melakukan extraksi kontennya:

package fjr.com.keminfo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;
public class Extract {
/** The original PDF that will be parsed. */
public static final String PREFACE = "F:/project data manipulasi/humas keminfo/data.pdf";
/** The resulting text file. */
public static final String RESULT = "F:/project data manipulasi/humas keminfo/data.txt";
static String reg = "([0-9]{1,5})\\s(THP-[0-9]{2}-([0-9]{16}))\\s[0-9]{2}\\sOktober"
+ "\\s2015\\s[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}" ;
public void parsePdf(String pdf, String txt) throws IOException {
PdfReader reader = new PdfReader(pdf);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PrintWriter out = new PrintWriter(new FileOutputStream(txt));
TextExtractionStrategy strategy;
Map<String,Integer > mapProvinsi = new TreeMap<String , Integer>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if( a < b )
return -1;
else if(a > b)
return 1;
return 0;
}
});
Map<String,Integer> mapKabupaten = new TreeMap<String , Integer>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if( a < b )
return -1;
else if(a > b)
return 1;
return 0;
}
});
Map<String,Integer> mapKecamatan = new TreeMap<String , Integer>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if( a < b )
return -1;
else if(a > b)
return 1;
return 0;
}
});
Map<String, ArrayList<String>> mapKecamatanToId = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
int a = Integer.parseInt(o1);
int b = Integer.parseInt(o2);
if( a < b )
return -1;
else if(a > b)
return 1;
return 0;
}
});
out.println("Daftar Peserta Verifikasi Berkas");
Pattern p = Pattern.compile(reg);
for( int i = 1; i <= reader.getNumberOfPages(); i++){
strategy = parser.processContent(i , new SimpleTextExtractionStrategy());
String result = strategy.getResultantText();
Matcher m = p.matcher(result);
while(m.find()){
out.print(m.group(1));
out.print("\t|");
out.print(m.group(2));
out.print("\t|");
out.println(m.group(3));
String prov = m.group(3).substring(0, 2);
if(mapProvinsi.get(prov) == null ){
mapProvinsi.put(prov , 1);
}else{
int index = mapProvinsi.get(prov);
mapProvinsi.put(prov, index + 1);
}
String kabu = m.group(3).substring(0 , 4);
if(mapKabupaten.get(kabu) == null ){
mapKabupaten.put(kabu , 1);
}else{
int index = mapKabupaten.get(kabu);
mapKabupaten.put(kabu , index + 1);
}
String keca = m.group(3).substring(0 , 6);
if(mapKecamatan.get(keca) == null ){
mapKecamatan.put(keca , 1);
}else{
int index = mapKecamatan.get(keca);
mapKecamatan.put(keca , index + 1);
}
if(mapKecamatanToId.get(keca) == null){
ArrayList<String> list = new ArrayList<>();
list.add(m.group(3));
mapKecamatanToId.put(keca, list);
}else{
ArrayList<String> list = mapKecamatanToId.get(keca);
list.add(m.group(3));
}
}
}
out.println("===================");
out.println("Jumlah Peserta Berdasarkan Provinsi");
for(Map.Entry<String, Integer> m : mapProvinsi.entrySet()){
out.print(m.getKey());
out.print("\t\t|");
out.println(m.getValue());
}
out.println("===================");
out.println("Jumlah Peserta Berdasarkan Kabupaten");
for(Map.Entry<String, Integer> m : mapKabupaten.entrySet()){
out.print(m.getKey());
out.print("\t\t|");
out.println(m.getValue());
}
out.println("===================");
out.println("Daftar Peserta Untuk Sulawesi Tengah");
for(Map.Entry<String, ArrayList<String>> m : mapKecamatanToId.entrySet()){
String key = m.getKey().substring(0, 2);
if(key.equals("72")){
out.print(m.getKey());
out.print("\t\t|");
for(String s : m.getValue()){
out.print(s);
out.print("\t\t|");
}
out.println();
}
}
out.flush();
out.close();
reader.close();
System.out.println("FINISH");
}
public static void main(String[] args) throws IOException {
// new ExtractPageContent().parsePdf(PREFACE, RESULT);
new Extract().parsePdf(PREFACE, RESULT);
}
}
view raw Extract.java hosted with ❤ by GitHub
Pada baris ke 26 dalam listing di atas, Anda bisa melihat bagaimana Pattern "([0-9]{1,5})\\s(THP-[0-9]{2}-([0-9]{16}))\\s[0-9]{2}\\sOktober" + "\\s2015\\s[0-9]{2}:[0-9]{2}-[0-9]{2}:[0-9]{2}" mengandung sejumlah kurung '()' yang menandakan expresi Capturing Group. Jadi dengan kode yang tertera di dalam kurung tersebut kita bisa mengambil bagian tertentu pada String yang match dengan regex untuk kemudian di proses lebih lanjut. Misalkan dalam seleksi humas tersebut NIK peserta ditambahkan dengan awalan 'THP-' maka dengan teknik capturing group ini kita membuang awalan 'THP-' nya tersebut dan hanya mengambil NIK nya.

Hasil running script di atas bisa dilihat di link ini.