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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
"([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.