我必须比较两个表并告诉用户两个表之间的区别。
表1
------+---------
|Code | Label |
------+---------
|a1 | a1text |
------+---------
|b1 | b1text |
------+---------
|c1 | bartext1|
------+---------
|e1 | foo |
-----+---------
表2
------+---------
|Code | Label |
------+---------
|a1 | a1text |
------+---------
|b1 | b2text |
------+---------
|d1 | bartext2|
------+---------
|f1 | bar |
------+---------
比较信息
正如您在表1中看到的代码c1
标签是bartext1
而代码d1
标签是bartext2
。
他们同样期待最后一个角色。我必须在报告中加上除了最后一个字符之外的相同内容。表中几行可能有额外的单词或特殊字符,其位置在任何地方。不知怎的,我必须在报告中告诉两个标签是相同的,期望的单词丢失,或者其中一个中有特殊字符。在报告中,代码并不重要。
更多信息
此数据来自第三方。代码始终是唯一的,它们不是重复的代码。
两个代码可能具有相似的值
喜欢
代码|标签
ER4 |我有一个兄弟
WE3 |我有一个兄弟
预期输出应为
答案 0 :(得分:2)
我使用equals实现为这个Table对象创建一个抽象,它将隐藏客户端的所有细节。 Java是一种面向对象的语言,因此最好将对象用于他们的存在理由。
答案 1 :(得分:1)
有一个开源Java框架可以做到这一点:
www.diffkit.org
答案 2 :(得分:1)
这对我有用,请随意添加盐味:
public final class ComparisonTest {
@Test
public void compare() throws Exception {
String url = "your.url";
String user = "your.user";
String password = "your.password";
// I am using Oracle here, but you can use any database
Connection connection = getConnection(url, user, password, OracleDriver.class);
ResultSet sourceResultSet = getResultSet(connection, "first_table");
ResultSet targetResultSet = getResultSet(connection, "second_table");
Map<Long, String> sourceIdHash = new HashMap<Long, String>();
Map<Long, String> targetIdHash = new HashMap<Long, String>();
try {
long rows = 0;
do {
if (sourceResultSet.next()) {
if (targetResultSet.next()) {
// Compare the lines
long sourceHash = hash(getRowValues(sourceResultSet, sourceResultSet.getMetaData()));
long targetHash = hash(getRowValues(targetResultSet, targetResultSet.getMetaData()));
sourceIdHash.put(sourceHash, sourceResultSet.getString(1));
targetIdHash.put(targetHash, targetResultSet.getString(1));
if (targetIdHash.containsKey(sourceHash)) {
targetIdHash.remove(sourceHash);
sourceIdHash.remove(sourceHash);
}
if (sourceIdHash.containsKey(targetHash)) {
sourceIdHash.remove(targetHash);
targetIdHash.remove(targetHash);
}
} else {
// Add the source row
long sourceHash = hash(getRowValues(sourceResultSet, sourceResultSet.getMetaData()));
sourceIdHash.put(sourceHash, sourceResultSet.getString(1));
}
} else {
if (targetResultSet.next()) {
// Add the target row
long targetHash = hash(getRowValues(targetResultSet, targetResultSet.getMetaData()));
targetIdHash.put(targetHash, targetResultSet.getString(1));
} else {
break;
}
}
if (rows++ % 10000 == 0) {
System.out.println("Rows : " + rows);
}
} while (true);
} finally {
closeAll(sourceResultSet);
closeAll(targetResultSet);
}
for (final Map.Entry<Long, String> mapEntry : sourceIdHash.entrySet()) {
if (targetIdHash.containsKey(mapEntry.getKey())) {
targetIdHash.remove(mapEntry.getKey());
continue;
}
System.out.println("Not in target : " + mapEntry.getValue());
}
for (final Map.Entry<Long, String> mapEntry : targetIdHash.entrySet()) {
if (sourceIdHash.containsKey(mapEntry.getKey())) {
sourceIdHash.remove(mapEntry.getKey());
continue;
}
System.out.println("Not in source : " + mapEntry.getValue());
}
System.out.println("In source and not target : " + sourceIdHash.size());
System.out.println("In target and not source : " + targetIdHash.size());
}
private ResultSet getResultSet(final Connection connection, final String tableName) {
String query = "select * from " + tableName + " order by pdb_key, organization_code, service_littera, day, resource_category";
return executeQuery(connection, query);
}
private Object[] getRowValues(final ResultSet resultSet, final ResultSetMetaData resultSetMetaData) throws SQLException {
List<Object> rowValues = new ArrayList<Object>();
for (int i = 2; i < resultSetMetaData.getColumnCount(); i++) {
rowValues.add(resultSet.getObject(i));
}
return rowValues.toArray(new Object[rowValues.size()]);
}
private final Connection getConnection(final String url, final String user, final String password, final Class<? extends Driver> driverClass) {
try {
DriverManager.registerDriver(driverClass.newInstance());
return DriverManager.getConnection(url, user, password);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private final ResultSet executeQuery(final Connection connection, final String query) {
try {
return connection.createStatement().executeQuery(query);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private final Long hash(final Object... objects) {
StringBuilder builder = new StringBuilder();
for (Object object : objects) {
builder.append(object);
}
return hash(builder.toString());
}
public Long hash(final String string) {
// Must be prime of course
long seed = 131; // 31 131 1313 13131 131313 etc..
long hash = 0;
char[] chars = string.toCharArray();
for (int i = 0; i < chars.length; i++) {
hash = (hash * seed) + chars[i];
}
return Long.valueOf(Math.abs(hash));
}
private void closeAll(final ResultSet resultSet) {
Statement statement = null;
Connection connection = null;
try {
if (resultSet != null) {
statement = resultSet.getStatement();
}
if (statement != null) {
connection = statement.getConnection();
}
} catch (Exception e) {
e.printStackTrace();
}
close(resultSet);
close(statement);
close(connection);
}
private void close(final Statement statement) {
if (statement == null) {
return;
}
try {
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void close(final Connection connection) {
if (connection == null) {
return;
}
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void close(final ResultSet resultSet) {
if (resultSet == null) {
return;
}
try {
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}