import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
* @author gjf
*db_pre.arff存储的是从xml文件中读取的xml信息
*/
public class ElmAuth {
Map<String, Integer> map = new HashMap<String, Integer>(); //第一步
//从xml文件中提取 读取xml文件中的author信息,写到db_pre.arff,并且替换特殊字符
public void settleXml(String src, String dst){//src=dblp.xml dst=db_pre.arff
File file = new File(src);
File fl = new File(dst);
FileReader fr;
try {
fr = new FileReader(file);
FileWriter fw = new FileWriter(fl);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
String line = null;
boolean flag = true;
int loc_st;
int loc_end;
int len = 0, max = 0;
while((line = br.readLine()) != null){
if(line == null)
break;
loc_st = line.indexOf("<author>");
if(loc_st != -1){
loc_end = line.indexOf("</author>");
line = line.substring(loc_st + 8, loc_end);//在<author></author>之间的数据,一个作者的名字
line=line.replace('&', ' ');
line=line.replace('$', ' ');
line=line.replace("' "," ");
line=line.replace("'", " ");
/*flag以文章为界限,在同一篇文章内,flag=false,写入在同一行*/
if(flag){
bw.write("\n");
bw.write(line);
} else {
bw.write(",");
bw.write(line);
}
len++;//每写一个作者,计数加 +1
flag = false;
} else {
flag = true;
if(max < len) max = len;//选择最大的len;
len = 0;
bw.flush();
}
}
System.out.println("第一步 论文中具有最大的作者数:" + max);
} catch (IOException e) {
e.printStackTrace();
}
} //消除只有单个作item
//第二步:将作者的信息db_pre.arff中只有一个作者的数据删除
public void elimate_one(String src, String dst){//src=db_pre.arff dst=db_elone.arff
try {
File file = new File(src);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
File filew = new File(dst);
FileWriter fw = new FileWriter(filew);
BufferedWriter bw = new BufferedWriter(fw);
Map<String, Integer> map = new HashMap<String, Integer>();
String line = null;
int k = 1;
int res = 0;
while((line = br.readLine()) != null){
String[] arrLine = line.split(",");
//作者之间用","隔离,","的数量表示作者的个数,数量比一少,则不写入.
if(arrLine.length > 1){
bw.write(line);
bw.write("\n");
res ++;
}
}
bw.flush();
br.close();
bw.close();
fr.close();
//System.out.println("The Row of the file is:" + res);
System.out.println("这篇论文中去除单个作者后的行数:" + res);
}catch (IOException e) {
e.printStackTrace();
}
} //将剩余的作储再hashMap中,key值为人名,value为出现的次数,支持度数
public void createMap(String src){//srr=db_elone.arff
try {
File file = new File(src);
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr); String line = null;
while((line = br.readLine()) != null){
if(line == null)
break;
String[] arrLine = line.split(",");
for(int i = 0; i < arrLine.length; ++i){
if(map.get(arrLine[i]) == null){
map.put(arrLine[i], 1);
} else {
map.put(arrLine[i], map.get(arrLine[i]) + 1);
}
}
}
fr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} //从hashMap中删除小于支持度minsup的作者,本次的支持度数为100;
public void settleMap(int minsup){
Iterator it = map.keySet().iterator();
while(it.hasNext()){
String str = (String) it.next();
if(map.get(str) < minsup){
it.remove();
}
}
System.out.println("Map的大小,支持度大于100的作者个数:" + map.size());
} //将大于minsup的作者存储到文件 db_minsup.arff,存储的是符合筛选的作者
public void updateMap(String src, String dst){//src=db_elone.arff dst=db_minsup.arff
try {
File filer = new File(src);
FileReader fr = new FileReader(filer);
BufferedReader br = new BufferedReader(fr); File filew = new File(dst);
FileWriter fw = new FileWriter(filew);
BufferedWriter bw = new BufferedWriter(fw); String line = null;
int res = 0;
boolean flag = true;
while((line = br.readLine()) != null){
if(line == null)break;
String[] arrLine = line.split(",");
if(flag == false)res++;
flag = true;
for(int i = 0; i < arrLine.length; ++i){
if(map.get(arrLine[i]) != null){
if(flag == true){
bw.write("\n" + arrLine[i]);
flag = false;
} else {
bw.write("," + arrLine[i]);
}
}
}
}
bw.flush();
System.out.println("符合筛选的作者合作写的论文篇数:" + res);
fw.close();
bw.close();
fr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} //生成weka识别的文 dst=db
public void createWekaFile(String src, String dst){//src=db_minsup.arff dst=db
try {
File filer = new File(src);
FileReader fr = new FileReader(filer);
BufferedReader br = new BufferedReader(fr); File filew = new File(dst);
FileWriter fw = new FileWriter(filew);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("@relation db" + "\n");
Iterator it = map.keySet().iterator();
while(it.hasNext()){
String str = (String) it.next();
str.replace("'", "\'");
bw.write("@attribute '" + str + "' { t}\n");
}
bw.write("@data" + "\n"); String line = null;
boolean flag = true;
while((line = br.readLine()) != null){
if(line == null)break;
flag = true;
char ch;
it = map.keySet().iterator();
while(it.hasNext()){
String str = (String)it.next();
if(line.indexOf(str) >= 0){
ch = 't';
} else {
ch = '?';
}
if(flag == true){
bw.write(ch);
} else {
bw.write("," + ch);
}
flag = false;
}
bw.write("\n");
}
bw.flush();
fw.close();
bw.close();
fr.close();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void clearMap(){
map.clear();
} public static void main(String args[]){
ElmAuth elmauth = new ElmAuth();
elmauth.settleXml("dblp.xml", "db_pre.arff");
elmauth.elimate_one("db_pre.arff", "db_elone.arff");
elmauth.createMap("db_elone.arff");
elmauth.settleMap(100);//确定最小支持度数
elmauth.updateMap("db_elone.arff", "db_minsup.arff"); for(int i = 0; i < 20; ++i){
System.out.println();
elmauth.elimate_one("db_minsup.arff", "db_minsup_elone.arff");
elmauth.clearMap();
elmauth.createMap("db_minsup_elone.arff");
elmauth.settleMap(100);
elmauth.updateMap("db_minsup_elone.arff", "db_minsup.arff");
} elmauth.createWekaFile("db_minsup.arff", "db.arff");
}
}

JAVA xml 流方式读取。数据挖掘大文件预处理。的更多相关文章

  1. Java中用内存映射处理大文件

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...

  2. Java使用内存映射实现大文件的上传

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...

  3. php读取操作大文件

    在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  4. PHP读取CSV大文件导入数据库的示例

    对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象. 为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的. 下面这个函数是读取CSV文件中指 ...

  5. PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)

    CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题. 1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容 ...

  6. java通过CLASSPATH读取包内文件

    读取包内文件,使用的路径一定是相对的classpath路径,比如a,位于包内,此时可以创建读取a的字节流:InputStream in = ReadFile.class.getResourceAsSt ...

  7. World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)

    http://blog.csdn.net/giser_whu/article/details/41679515 首先,看下本篇博客要达到的效果图: 下面逐步分析如何加载影像及高程文件. 1.World ...

  8. JAVA用geotools读取shape格式文件

    Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性.但这种格式没法存储地理数据的拓扑信息. 其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是". ...

  9. [转]World Wind Java开发之五——读取本地shp文件

    World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首 ...

随机推荐

  1. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  2. C#: 方法的默认参数

    大家都知道在C++中,我们可以为方法的参数指定一个默认值,像这样: void foo(int i = 100); 当我们以这种形式调用方法的时候: foo(); 实际上参数i被赋于了默认值,所以相当于 ...

  3. [网络]远程访问局域网svn服务器[转]

    转至:http://8474832.blog.51cto.com/8464832/1555449 打开路由器访问界面 选择转发规则->端口映射-新建 在弹出的界面中填写相应的端口号了内网ip 填 ...

  4. IC各元器件封装形式图解

    CDIP-----Ceramic Dual In-Line Package CLCC-----Ceramic Leaded Chip Carrier CQFP-----Ceramic Quad Fla ...

  5. iOS获取文件和文件夹大小

    //通常用于删除缓存的时,计算缓存大小 //单个文件的大小 - (long long) fileSizeAtPath:(NSString*) filePath{ NSFileManager* mana ...

  6. JavaScript神一样的变量系统

    话说上一篇介绍了JavaScript故事版的身世之谜.看官你估计也明白JavaScript出生之时,就未曾托于重任.布兰登-艾奇估计也没料到今天的JavaScript变得如此重要.要不然,当年他也不会 ...

  7. HTTP原理

    HTTP原理 1 简介 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统. HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式. 2.简单快速:客 ...

  8. flume ng配置拓扑图

  9. xml和xsl配合使用实例

    找到一个实际应用的例子,是英语统考打印准考证的实例,关于xml和xsl配合使用的. 下面看看xml文档 <?xml version='1.0' encoding='utf-8' ?> &l ...

  10. PL/pgSQL多输出参数例子

    例子一,不带returns: postgres=# CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS ...