今天闲来无事,凭着对大数据和海量数据的浓厚兴趣,把很久之前想写但没写完的程序坚持写完了,下面简要介绍一下吧。
这些程序的主要目的是统计世界大学的信息,主要的数据来源就是人人网了,在人人网上有一个接口,就是在查询大学数据的时候,通过Ajax会向后台发送一个请求(http://s.xnimg.cn/a27085/allunivlist.js),这个请求的返回值就是一个js文件,而这个js文件就是一个很大的json对象,然后通过解析这个json对象就可以得到世界大学的信息了。
原来在论坛里面已经有人对此做了实现(http://www.iteye.com/topic/1118508),不过貌似比较复杂,源码看得都累了,所以自己想做一个实现,简化一些操作。
首先就是要保存下来这个js文件,对保存下来的js文件稍作修改:var allUnivList = [{"id":"00","univs":"",改成[{"id":0,"univs":"",也就是把前面变量定义去掉,因为已经没用了,还有就是把00改成0。基本上就是这些,下面是工程的源代码:
首先说明一下,要看得懂这里的源代码,其实还是需要花费一段时间的,主要就是对那个很大的json对象要很熟悉,下面是我整理出的一个对象框架,希望能让读者受益:(考虑到阅读方便,这里已经做了转码)
[{"id":0,"univs":"","name":"中国","provs":[//像中国这样的,国家没有大学,只有省市级别的才有大学 {"id":1,"univs":[{"id":1001,"name":"清华大学"}...{"id":2000,"name":"中北国际演艺学校"}],"country_id":0,"name":"北京"}, {"id":2,"univs":[{"id":2001,"name":"复旦大学"}...{"id":2169,"name":"上海大学巴士汽车学院"}],"country_id":0,"name":"上海"}, ... {"id":32,"univs":[{"id":32001,"name":"香港大学"}...{"id":32013,"name":"The Open University of HongKong"}],"country_id":0,"name":"香港"}, ... {"id":34,"univs":[{"id":34001,"name":"国立台湾大学"}...{"id":34055,"name":"铭传大学 "}],"country_id":0,"name":"台湾"} ]}, ...//省略了很多国家 {"id":"28","univs":[//像印度这样的,没有省市级别的大学只有国家的大学 {"id":2800001,"name":"University of Delhi"}...{"id":2800008,"name":"St.xavier's College"}], "name":"印度","provs":""}, {"id":"29","univs":[//奥地利也和印度一样只有国家级别的大学 {"id":2900001,"name":"Akademie der bildenden Künste Wien"}...{"id":2900110,"name":"Wirtschaftsuniversität Wien "}], "name":"奥地利","provs":""}]
下面就是真正的源代码:
UniBean.java
package com.universities.samples; public class UniBean { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ProBean.java
package com.universities.samples; public class ProBean { private Integer id; private String univs; private Integer country_id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUnivs() { return univs; } public void setUnivs(String univs) { this.univs = univs; } public Integer getCountry_id() { return country_id; } public void setCountry_id(Integer country_id) { this.country_id = country_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
ConBean.java
package com.universities.samples; public class ConBean { private Integer id; private String univs; private String name; private String provs; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUnivs() { return univs; } public void setUnivs(String univs) { this.univs = univs; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProvs() { return provs; } public void setProvs(String provs) { this.provs = provs; } }
University.java
package com.universities.samples; public class University { private Long id;//自动生成。主要为防止冲突的 private String name;//大学名称 private Integer cid;//国家编号 private String county;//国家名 private Integer pid;//省市编号 private String province;//省市名 private Integer uid;//大学在国家里的编号 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCounty() { return county; } public void setCounty(String county) { this.county = county; } public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } }
UniDao.java
package com.universities.samples; import java.sql.Connection; public class UniDao { private static Connection connection = null; private UniDao(){} private static UniDao instance = new UniDao(); public static UniDao getInstance(){ return instance; } public static Connection getConnection() { try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection( "jdbc:mysql://localhost:9906/school", "root", "root"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return connection; } // 插入数据的方法 public static boolean insertUni(University university) { boolean bool = false; getConnection(); String sql = "insert into university(name,cid,county,pid,province,uid) values(?,?,?,?,?,?)"; try { PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, university.getName()); statement.setInt(2, university.getUid()); statement.setString(3, university.getCounty()); statement.setInt(4, university.getPid()); statement.setString(5, university.getProvince()); statement.setInt(6, university.getUid()); if (statement.executeUpdate() > 0) { bool = true; } statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } return bool; } }
Main.java
package com.universities.samples; import java.io.BufferedReader; public class Main { private static List<UniBean> uniBeans = new ArrayList<UniBean>(); private static Map<ProBean, List<UniBean>> proBeans = new HashMap<ProBean, List<UniBean>>(); //主体方法,负责读入文件,将文件中的json对象转换成对应的Bean然后整理之后插入到数据库中 public void convert(File fileName){ try { BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); String content = null; while ((content = bf.readLine())!=null) {//文件正文只有一行 while (content.indexOf("}")>0) { String temp = content.substring(0, content.indexOf("}")+1); String temp1 = temp.substring(temp.lastIndexOf("{"),temp.length()); if (!temp1.contains("univs")) { JSONObject jsonObject = JSONObject.fromObject(temp1); UniBean uniBean = (UniBean)JSONObject.toBean(jsonObject,UniBean.class); uniBeans.add(uniBean); }else if (!temp1.contains("provs")) { temp1 = temp1.replaceAll("\\[[^\\]]*\\]", "\"\""); JSONObject jsonObject = JSONObject.fromObject(temp1); ProBean proBean = (ProBean)JSONObject.toBean(jsonObject,ProBean.class); if (uniBeans.size()>0) { String county = content.substring(content.indexOf("name")+7,content.indexOf("provs")-3); for (UniBean uniBean : uniBeans) { University university = new University(); university.setName(uniBean.getName()); university.setCid(proBean.getCountry_id()); university.setCounty(UnicodeToGB2312(county)); university.setPid(proBean.getId()); university.setProvince(proBean.getName()); university.setUid(uniBean.getId()); if (UniDao.insertUni(university)) { System.out.println(university.getUid()+university.getCounty()+university.getName()); } } uniBeans.clear(); } }else { temp1 = temp1.replaceAll("\\[[^\\]]*\\]", "\"\""); JSONObject jsonObject = JSONObject.fromObject(temp1); ConBean conBean = (ConBean)JSONObject.toBean(jsonObject,ConBean.class); if (proBeans.size()<=0 && uniBeans.size()>0) {//说明这个国家只有国家大学 for (UniBean uniBean : uniBeans) { University university = new University(); university.setName(uniBean.getName()); university.setCid(conBean.getId()); university.setCounty(conBean.getName()); university.setPid(0); university.setProvince(conBean.getProvs()); university.setUid(uniBean.getId()); if (UniDao.insertUni(university)) { System.out.println(university.getUid()+university.getCounty()+university.getName()); } } } uniBeans.clear(); } content = content.substring(0, temp.lastIndexOf("{"))+content.substring(content.indexOf("}")+1, content.length()); } } bf.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //转换字符编码,将所有的unicode替换成中文编码(gbk) public static String UnicodeToGB2312(String str) { String res = null; StringBuffer sb = new StringBuffer(); try { while (str.length() > 0) { if (str.startsWith("\\u")) { int x = Integer.parseInt(str.substring(2, 6), 16); sb.append((char) x); str = str.substring(6); } else { sb.append(str.charAt(0)); str = str.substring(1); } } res = sb.toString(); } catch (Exception e) { e.printStackTrace(System.err); } return res; } public static void main(String[] args) { new Main().convert(new File("src//schools.txt")); } }
还有的就是不能少了的schools.txt因为文件较大,就不贴出来了,在附件中有下载。
代码写的很清晰,基本上不需要太多的解释,把数据全部插入到数据库中以后,在navicat中做了这样一个查询,就是统计每个国家的大学数量,然后按照数量降序排列:
首先比较惊讶的应该是中国和美国的差距,然后就是小日本这样的弹丸之国居然有这么高的大学数量,确实很让人深思。
然后还有一张就是下面的这张图片,这样看的话,江苏很给力呀,如果不出意外的话这张图基本上就代表了省市的经济实力吧,呵呵。
好吧,还是以技术为主,其他的还是少聊吧,项目中用到了json-lib,打包的项目放在附件中,有兴趣的可以去下载。