DSLab1

本文详细描述了在Java中如何使用OpenCSV库操作CSV文件,创建MySQL数据库表,并处理room和student数据的插入。涉及数据库连接、数据清洗、外键完整性以及处理不完整或不一致数据的原则。
摘要由CSDN通过智能技术生成

代码实现

代码

package org.example;
import com.opencsv.CSVReader;
import java.io.*;
import java.sql.*;

public class Main {
    public static class DatabaseInitializer {
        public static void main(String[] args) {
            String csvFilePath1 = "data/room.csv";
            String csvFilePath2 = "data/student.csv";

            String dbUrl = "jdbc:mysql://localhost:3306/dslab1";
            String username = "root";
            String password = "45683968sqlHeRui";

            try {
                //建立数据库连接
                Connection connection = DriverManager.getConnection(dbUrl, username, password);

                // 创建room表
                String createRoomTableSql = "CREATE TABLE room (" +
                        "kdno VARCHAR(10), " +
                        "kcno VARCHAR(10), " +
                        "ccno VARCHAR(10), " +
                        "kdname VARCHAR(100), " +
                        "exptime VARCHAR(50), " +
                        "papername VARCHAR(50)" +
                        ")";
                Statement createRoomTableStatement = connection.createStatement();
                createRoomTableStatement.executeUpdate(createRoomTableSql);
                createRoomTableStatement.close();

                // 创建student表
                String createStudentTableSql = "CREATE TABLE student (" +
                        "registno VARCHAR(10), " +
                        "name VARCHAR(100), " +
                        "kdno VARCHAR(10), " +
                        "kcno VARCHAR(10), " +
                        "ccno VARCHAR(10), " +
                        "seat VARCHAR(10)" +
                        ")";
                Statement createStudentTableStatement = connection.createStatement();
                createStudentTableStatement.executeUpdate(createStudentTableSql);
                createStudentTableStatement.close();

                // 读取并插入room.csv的数据(修改kdname编码)
                CSVReader roomReader = new CSVReader(new InputStreamReader(new FileInputStream(csvFilePath1), "GBK"));
                String[] roomRow;
                while ((roomRow = roomReader.readNext()) != null) {
                    String kdno = roomRow[0];
                    String kcno = roomRow[1];
                    String ccno = roomRow[2];
                    String kdname = roomRow[3];
                    String exptime = roomRow[4];
                    String papername = roomRow[5];

                    String roomInsertQuery = "INSERT INTO room (kdno, kcno, ccno, kdname, exptime, papername) " +
                            "VALUES (?, ?, ?, ?, ?, ?)";

                    PreparedStatement roomStatement = connection.prepareStatement(roomInsertQuery);
                    roomStatement.setString(1, kdno);
                    roomStatement.setString(2, kcno);
                    roomStatement.setString(3, ccno);
                    roomStatement.setString(4, kdname);
                    roomStatement.setString(5, exptime);
                    roomStatement.setString(6, papername);

                    roomStatement.executeUpdate();
                    roomStatement.close();
                }
                roomReader.close();

                // 读取并插入student.csv的数据
                CSVReader studentReader = new CSVReader(new FileReader(csvFilePath2));
                String[] studentRow;
                while ((studentRow = studentReader.readNext()) != null) {
                    String registno = studentRow[0];
                    String name = studentRow[1];
                    String kdno = studentRow[2];
                    String kcno = studentRow[3];
                    String ccno = studentRow[4];
                    String seat = studentRow[5];

                    String studentInsertQuery = "INSERT INTO student (registno, name, kdno, kcno, ccno, seat) " +
                            "VALUES (?, ?, ?, ?, ?, ?)";

                    PreparedStatement studentStatement = connection.prepareStatement(studentInsertQuery);
                    studentStatement.setString(1, registno);
                    studentStatement.setString(2, name);
                    studentStatement.setString(3, kdno);
                    studentStatement.setString(4, kcno);
                    studentStatement.setString(5, ccno);
                    studentStatement.setString(6, seat);

                    studentStatement.executeUpdate();
                    studentStatement.close();
                }
                studentReader.close();

                // 关闭数据库连接
                connection.close();

                System.out.println("Success");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果

room

在这里插入图片描述


student

在这里插入图片描述


运行说明

  1. 建立数据库连接,使用DriverManager.getConnection()方法传入数据库URL、用户名和密码来获取连接对象。

  2. 通过Statement对象执行CREATE TABLE语句创建room表和student表。

  3. 读取room.csv文件的数据:使用CSVReader对象逐行读取数据,将每行数据插入到room表中,通过PreparedStatement对象执行INSERT INTO语句,并将数据绑定到预处理语句中的参数上。读取student.csv文件,同理。需要注意的是,room表中的kdname要使用GBK编码,否则会以乱码形式出现。

  4. 程序关闭数据库连接,打印Success表示操作成功。


思考题

如果外部数据(原始数据表)数据不完整(例如某个不应该为空的字段缺失数据)或不一致(例如本应有外键关系的数据并没有保持引用完整性),有哪些方法可以处理?你能总结出哪些处理原始数据的原则?

  1. 外部数据(原始数据表)数据不完整或不一致时:
  • 数据清洗:对原始数据进行清洗,去除不完整或不一致的数据。可以通过删除缺失数据的行或填充缺失数据来处理不完整的数据。对于不一致的数据,可以进行数据转换或规范化,以确保数据的一致性。
  • 数据补全:对于缺失的数据,可以通过其他数据源进行补全。例如,可以通过 均值,中位数与众数线性回归建模预测从其他数据表中获取相关数据 等方法来填充缺失的字段。
  • 引用完整性维护:对于缺失外键关系的数据,可以通过引入外键约束来确保引用完整性。这样可以防止插入不一致的数据,并在删除或更新主表数据时进行级联操作。

  1. 处理原始数据的原则:
  • 确保数据的完整性、准确性和一致性。
  • 数据应该符合预期的格式、规范和约束。
  • 对于不完整或不一致的数据,进行清洗和修复。
  • 对于存在外键关系的数据,确保引用完整性,避免数据的不一致性。
  • 在处理原始数据之前和之后,进行数据验证和检查,以确保数据的正确性和一致性。
  • 记录数据处理的过程和方法,以便日后的审查和追溯。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值