package osm.jp.postgis; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import jp.co.areaweb.tools.csv.CsvFile; import jp.co.areaweb.tools.csv.CsvRecord; import osm.jp.api.Japan; public class CoverageAll { /* public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException, TransformerException { if (args.length < 3) { System.out.println("osm.jp.postgis.CoverageAll [outputfile.csv] [outputfile.json] [TABLE_NAME]"); return; } File outputFileCsv = new File(args[0]); File outputFileJson = new File(args[1]); String tableName = args[2]; CoverageAll obj = new CoverageAll(tableName); Connection conPost = DatabaseTool.openDb(Coverage.DB_PORP_GISDB); Connection conHsql = DatabaseTool.openDb(Coverage.DB_PORP_LOCALDB); try { obj.load(conPost, conHsql); obj.outputCSV(outputFileCsv); obj.outputJson(outputFileJson, "Data source"); } finally { DatabaseTool.closeDb(conHsql); DatabaseTool.closeDb(conPost); } } */ public static DecimalFormat df3 = new DecimalFormat("##0.00"); public String tableName; public File outputFile; public ArrayList<CoverageData> data; public String dateStr; /** * * @param pbfDate {"date":"2017-09-22"} * @throws java.io.FileNotFoundException */ public CoverageAll(File pbfDate) throws FileNotFoundException, IOException { if (pbfDate == null) { dateStr = LocalDate.now().format(DateTimeFormatter.ISO_DATE); } else { String tmp; try (FileReader fr = new FileReader(pbfDate); BufferedReader br = new BufferedReader(fr)) { while((tmp=br.readLine()) != null){ JsonReader jsonReader = Json.createReader(new StringReader(tmp)); JsonObject obj = jsonReader.readObject(); dateStr = obj.getString("date"); System.out.println(dateStr); return; } } } } public void setTablename(String tableName) { this.tableName = tableName; } public void setData(ArrayList<CoverageData> data) { this.data = data; } /** * useually : load(conPost, conHsql, null); * * @param conPost * @param conHsql * @throws ClassNotFoundException * @throws SQLException * @throws IOException */ /* public abstract void load(Connection conPost, Connection conHsql) throws ClassNotFoundException, SQLException, IOException; */ /** * * @param conPost * @param conHsql * @param tableName * @param where * @throws ClassNotFoundException * @throws SQLException * @throws IOException */ public void load(Connection conPost, Connection conHsql, String tableName, String where) throws ClassNotFoundException, SQLException, IOException { // 都道府県名(name)の設定 for (int i=0; i < Japan.areaArgs.length; i++) { CoverageData cover = new CoverageData(i, Japan.areaArgs[i], tableName); // 分母(denominator)、分子(molecule)、Lv を記入 // 全国の設定 if (i == 0) { // 全国の総計 String whereStr = ((where == null) ? "" : String.format("WHERE (%s)", where)); String sql = String.format("SELECT COUNT(*) FROM t_%s %s", tableName, whereStr); System.out.println(sql); PreparedStatement ps2 = conPost.prepareStatement(sql); ResultSet rset2 = ps2.executeQuery(); if (rset2.next()) { cover.denominator = rset2.getLong(1); } rset2.close(); whereStr = "WHERE (fixed > 0)" + ((where == null) ? "" : String.format(" and (%s)", where)); sql = String.format("SELECT COUNT(*) FROM t_%s %s", tableName, whereStr); System.out.println(sql); ps2 = conPost.prepareStatement(sql); rset2 = ps2.executeQuery(); if (rset2.next()) { cover.molecule = rset2.getLong(1); } rset2.close(); } else { // 都道府県毎の小計 String whereStr = "WHERE (area=?)" + ((where == null) ? "" : String.format(" and (%s)", where)); String sql = String.format("SELECT COUNT(*) FROM t_%s %s", tableName, whereStr); PreparedStatement ps2 = conPost.prepareStatement(sql); ps2.setInt(1, i); System.out.println(String.format("'%s', %d", sql, i)); ResultSet rset2 = ps2.executeQuery(); if (rset2.next()) { cover.denominator = rset2.getLong(1); } rset2.close(); whereStr = "WHERE (fixed > 0) and (area=?)" + ((where == null) ? "" : String.format(" and (%s)", where)); sql = String.format("SELECT COUNT(*) FROM t_%s %s", tableName, whereStr); System.out.println(String.format("'%s', %d", sql, i)); ps2 = conPost.prepareStatement(sql); ps2.setInt(1, i); rset2 = ps2.executeQuery(); if (rset2.next()) { cover.molecule = rset2.getLong(1); } rset2.close(); } if (cover.denominator > 0) { cover.par = (double)cover.molecule / cover.denominator; cover.par *= 100.0D; } else { cover.par = 100.0D; } data.add(cover); } } /** * CSVファイルに出力する * @param outputFile * @throws IOException */ public void outputCSV(File outputFile) throws IOException { CsvFile csv = new CsvFile(outputFile); CsvRecord line = new CsvRecord(); line.add("コード"); line.add("都道府県"); line.add("母数"); line.add("入力数"); line.add("率(%)"); csv.add(line); System.out.println(line.toString()); try { for (CoverageData cover : this.data) { line = new CsvRecord(); line.add(String.valueOf(cover.areacode)); line.add(cover.name); line.add(String.valueOf(cover.denominator)); line.add(String.valueOf(cover.molecule)); line.add(String.valueOf(df3.format(cover.par))); csv.add(line); System.out.println(line.toString()); } } finally { csv.save(); } } public void outputJson(File outputFile, String sourcedata) throws FileNotFoundException, UnsupportedEncodingException, IOException { try (BufferedWriter hw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"))) { int level = 0; hw.write(space(level++) + "{"); hw.newLine(); hw.write(space(level) + "\"timestamp\": \""+ dateStr +"\","); hw.newLine(); hw.write(space(level) + "\"sourcedata\": \""+ sourcedata +"\","); hw.newLine(); hw.write(space(level++) + "\"coverage\": ["); hw.newLine(); boolean head = true; for (CoverageData cover : this.data) { if (head == false) { hw.write(space(level) + ","); } else { head = false; } hw.write(space(level++) + "{"); hw.newLine(); hw.write(space(level) + "\"code\": "+ String.valueOf(cover.areacode) +","); hw.newLine(); hw.write(space(level) + "\"name\": \""+ cover.name +"\","); hw.newLine(); hw.write(space(level) + "\"denominator\": "+ String.valueOf(cover.denominator) +","); hw.newLine(); hw.write(space(level) + "\"molecule\": "+ String.valueOf(cover.molecule) +","); hw.newLine(); hw.write(space(level) + "\"par\": "+ String.valueOf(df3.format(cover.par))); hw.newLine(); hw.write(space(--level) + "}"); hw.newLine(); } hw.write(space(--level) + "]"); hw.newLine(); hw.write(space(--level) + "}"); hw.newLine(); hw.flush(); } } static String space(int level) { return (" ".substring(0,(level > 12 ? 12 : level))); } }