数据预处理(一)

这部分的工作主要是对数据进行预处理。
我们在处理数据的时候一般会面对不同格式的数据,这样每次用数据的时候就需要重复执行或编写一些代码,这样就浪费了不少时间。这里先把数据(以DeSheng Zhang 老师提供的数据为例)进行第一步的预处理。

我的工作流程计划是:

1
2
3
4
graph LR
A[数据预处理] --> B[数据清洗]
B-->C[数据统计]
C-->D[数据可视化]
  • 在数据预处理阶段,主要进行的工作是对数据进行格式化,将所获得数据统一格式,这样方便后续工作。
  • 数据清洗阶段,将要进行的是对已经存储数据的质量进行分析,比如在收集的数据中,会存在一些数据值的缺失,数据乱序,或者一些重复数据的处理问题。
  • 数据统计阶段,是根据实际的需要对数据应用一些统计方法,进行分析,这部分是最重要的,也是需要我们花费更多的时间去学习的。
  • 数据可视化阶段是对数据以图的形式更直观的展现出来。会提供一些图的模版。
    最终实现的效果是,只需要上传数据就可以将数据映射到图中。

文件的读取

首先,将文件进行读取到系统中,这里仅是一个txt文件的实例。
对于xml等表格文件,还会继续学习。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class FileRead {
public List<List<String>> readFILE() {
File file = new File("文件路径");
//
List<List<String>> allList = new ArrayList<List<String>>();
BufferedReader reader = null;
try {
Reader inputStream = new FileReader(file);
reader = new BufferedReader(inputStream);
String line = null;
while((line = reader.readLine())!=null) {
String liString [] = line.split(",");
List<String> list = new ArrayList<String>();
for(String s:liString) {
list.add(s);
}
allList.add(list);
}
return allList;

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}

数据的存储与格式化

将数据进行格式化,统一存储在数据库中,方便我们后续对数据进行存取操作,也易于数据的保存。

  1. 先是创建程序与数据库的连接操作,这里使用的是C3P0的连接方式,当然还有JDBC的连接方式。掌握一种就可以。
    这个类里面定义的是数据库连接所需要的一些基本的连接与关闭方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class JdbcUtils {
    //初始化连接池
    private static DataSource dataSource;
    static {
    dataSource = new ComboPooledDataSource();
    }
    public static DataSource getDataSource()
    {
    return dataSource;
    }
    //创建dbutil 常用工具类对象
    public static QueryRunner getQueryRunner() {
    return new QueryRunner(dataSource);
    }
    // 获取数据库连接对象
    public static Connection getConnection() {
    Connection conn = null;
    try {
    conn = dataSource.getConnection();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return conn;
    }

    // 关闭数据库连接
    public static void close(Connection conn,PreparedStatement ps) {
    try {
    if (conn != null && conn.isClosed()) {
    conn.close();
    }
    if(ps!=null) {
    ps.close();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
  1. 用户自定义需要存储数据的表名,以及列名。标记列名是为了方便我们对数据的理解。实际上,我们取值的时候只需要根据表的行号以及列号进行取值就可以。
    下面的这个类是一个工具类,用来生成在数据库中需要执行的sql语句。实现自动化处理。这里要求在为列取名字的时候尽量使用英文,因为中文可能会出现编码格式不一样的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class DataBaseTool {
//根据用户定义的 数据库的表名,列名 来创建一个基本的数据库 (名称要选取英文字母)
public String createDataBase(List<String> lie) {
String sql = "CREATE TABLE ";
//计算列的长度并遍历
if(lie.size()!=0) {
sql+=(lie.get(0)+"( ");
for(int i =1;i<lie.size()-1;i++) {
sql+=(lie.get(i)+" VARCHAR(50),");
}
sql+=(lie.get(lie.size()-1)+" VARCHAR(50));");
}else {
return null;
}
return sql;
}
// 往数据库中插入数据 数据库的表名 返回插入数据的sql语句
public String InsertData(List<String> lie){
String sql = "INSERT INTO "+lie.get(0)+"(";
String valueString = "";
if(lie.size()!=0) {
int len = lie.size();
for(int i=1;i<len-1;i++) {
sql+=(lie.get(i)+",");
valueString+="?,";
}
sql+=(lie.get(len-1)+") value("+valueString+"?);");

}else {
return null;
}
return sql;
}
}
  1. 最后,我们要执行的是将我们缓存在系统中的数据存储在我们自定义的数据库中,保存成统一的格式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class BaseOperate {
DataBaseTool tool = new DataBaseTool();
Connection conn = null;
PreparedStatement ps = null;
Result rs = null;
//根据相关数据在数据库中,创建一个数据表,用来存储数据
public void createTable(List<String> lie) {
String sql = tool.createDataBase(lie);
try {
JdbcUtils.getQueryRunner().update(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//批量导入数据到数据表中
public void INSERTDate(List<String> lie) {
FileRead toolFileRead = new FileRead();
List<List<String>> mapList = toolFileRead.readFILE();
String sql = tool.InsertData(lie);
conn = JdbcUtils.getConnection();
try {
//设置不自动提交执行
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
for (int i = 0; i < mapList.size(); i++) {
for(int j = 0;j<mapList.get(0).size();j++) {
ps.setString(j+1,mapList.get(i).get(j));
}
ps.addBatch();
}
int[] a = ps.executeBatch();
ps.clearBatch();
conn.commit();
System.out.println(a.length);
} catch (SQLException e) {
// TODO Auto-generated catch block
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.close(conn, ps);
}
}
}

4、实现的效果为下图所示,这样我们就可以对数据的每一行或者每一列进行分析,,更加直观,可以只关注我们要关注的那部分:
在这里插入图片描述