0

我正在用 Java 创建一个程序,我需要比较 csv 文件中的数据是否与 mysql 表中存在的数据完全相同?我怎样才能做到这一点?例如,我有一个表“供应商”,其中包含“ID、名称和地址”列。谢谢

下面是我读取 csv 文件并连接到数据库并在表中显示数据的代码。

    public static void le_csv() {
            String row;
            BufferedReader csvReader = null;
            try {
                csvReader = new BufferedReader(new FileReader("C:\\Users\\User\\Desktop\\ficheiros\\fornecedores.csv"));
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                while ((row = csvReader.readLine()) != null) {
                    String[] data = row.split(",");
                    System.out.println(data[0] + "\t" + data[1] + "\t" + data[2]);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                csvReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    > 
    > 
    > 
    public static void query(){
        try {
                String url = "jdbc:mysql://127.0.0.1:3306/database";
                String user = "user";
                String password = "password";
                Class.forName("com.mysql.jdbc.Driver");
                Connection conn = DriverManager.getConnection(url, user, password);
    
                String sql = "SELECT * FROM SUPLYERS";
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery(sql);
    
                while (rs.next()) {
                    System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3);
                }
    
                rs.close();
                st.close();
                conn.close();
    
            } catch (Exception exc) {
                exc.printStackTrace();
            }
}
4

1 回答 1

0

您可以将 CSV 数据和 DB 数据收集到 String 列表中,然后使用以下方法比较列表equals

    public static List<String> readCsvData() {
        List<String> csvData = new ArrayList<>();
        // use try-with-resources to auto close reader
        try (BufferedReader csvReader = new BufferedReader(new FileReader("C:\\Users\\User\\Desktop\\ficheiros\\fornecedores.csv"))){
            String row;
            while ((row = csvReader.readLine()) != null) {
                String[] data = row.split(",");
                row = String.join("\t", data[0], data[1], data[2]);
                System.out.println(row);
                csvData.add(row);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        return csvData;
    }

    public static void initDb() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    public static List<String> readDbData(){
        initDb();
        String url = "jdbc:mysql://127.0.0.1:3306/database";
        String user = "user";
        String password = "password";
        String sql = "SELECT * FROM SUPLYERS";
        List<String> dbData = new ArrayList<>();

        // use try-with-resources to auto close SQL connection, etc.
        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery(sql);
        ) {
            while (rs.next()) {
                String row = String.join("\t", rs.getString(1), rs.getString(2), rs.getString(3));
                System.out.println(row);
                dbData.add(row);
            }
        } catch (Exception exc) {
            exc.printStackTrace();
            throw new RuntimeException(exc);
        }
        return dbData;
    }
    
    public static boolean areCsvDataSameAsDb() {
        List<String> csvData = readCsvData();
        List<String> dbData = readDbData();
        
        return csvData.equals(dbData);
    }

或者,您可以逐行读取数据,以便在检测到任何差异后立即进行检查。

于 2020-07-28T10:08:49.243 回答