JDBCTemplate queryForMap 比较和替换提取行中的值
JDBCTemplate queryForMap compare and replace value in extracted lines
你能帮我理解为什么我的代码不起作用吗?
我正在尝试从我的数据库中获取 2 列的值并将它们存储在哈希图中,其中 K_PARAM 是我的键,L_PARAM 是我的值。然后我想比较我正在提取的一行中的 2 个字符,看看这 2 个字符是否等于我的键。如果它们相等,我将 key 替换为 value.
提前致谢。这是代码:
if (action.equals("RP")) {
if (marqueCarte = null) {
jdbcTemplate.query(" select K_PARAM, L_PARAM from DLCOA.DLC_ADM_PARAMS where K_CHX_PARAM = '50'", new ResultSetExtractor<Map>(){
@Override
public Map extractData(ResultSet rs) throws SQLException,DataAccessException {
HashMap<String,String> marqueCarte = new HashMap<String,String>();
while (rs.next()) {
marqueCarte.put(rs.getString("K_PARAM"),rs.getString("L_PARAM"));
if (line.contains("blocE")) {
if (line.substring(line.indexOf("blocE") + 15, line.indexOf("blocE") + 15 + (line.substring(line.indexOf("blocE")+15)).indexOf("#")).equals(rs.getString("K_PARAM"))){
line = line.replace(line.substring(line.indexOf("blocE") + 15, line.indexOf("blocE") + 15 + (line.substring(line.indexOf("blocE")+15)).indexOf("#")),rs.getString("L_PARAM") );
}
}
}
return marqueCarte;
}
}
}
}
对于你的第二个问题,我得到了一个更具可读性和可修改性的解决方案。
(我仍然不确定你的第一个是什么)
使用正则表达式和模式你可以实现你想要的替换。
假设您要搜索文本 "blocE" 后跟 15 个字符,同时搜索 rs.getString("K_PARAM")
中包含的文本加上“#”
我们可以将您搜索的内容建模为这样的模式
"(blocE)(.{15})(" + key + "#)"
括号允许我们在正则表达式中建立不同的组。
Group 1 - blocE
Group 2 - 15 characters
Group 3 - key + #
作为组 0 的完整匹配表达式。
了解这一点后,您可以使用以下代码进行替换
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) {
String key = "KEY"; // rs.getString("K_PARAM")
String value = "VALUE"; // rs.getString("L_PARAM")
Pattern pattern = Pattern.compile("(blocE)(.{15})(" + key + "#)");
String input ="helloworldblocE111111111111111KEY#blocE111111111111111KEY";
Matcher m = pattern.matcher(input);
if (m.find()) {
String text2replace = m.group(0);
String replacement = m.group(1) + m.group(2) + value;
System.out.println(input.replaceFirst(text2replace, replacement));
}
}
}
如果你的图案改变了,你只需要改变一根线,你不用担心indexOf
.
的数量
你能帮我理解为什么我的代码不起作用吗?
我正在尝试从我的数据库中获取 2 列的值并将它们存储在哈希图中,其中 K_PARAM 是我的键,L_PARAM 是我的值。然后我想比较我正在提取的一行中的 2 个字符,看看这 2 个字符是否等于我的键。如果它们相等,我将 key 替换为 value.
提前致谢。这是代码:
if (action.equals("RP")) {
if (marqueCarte = null) {
jdbcTemplate.query(" select K_PARAM, L_PARAM from DLCOA.DLC_ADM_PARAMS where K_CHX_PARAM = '50'", new ResultSetExtractor<Map>(){
@Override
public Map extractData(ResultSet rs) throws SQLException,DataAccessException {
HashMap<String,String> marqueCarte = new HashMap<String,String>();
while (rs.next()) {
marqueCarte.put(rs.getString("K_PARAM"),rs.getString("L_PARAM"));
if (line.contains("blocE")) {
if (line.substring(line.indexOf("blocE") + 15, line.indexOf("blocE") + 15 + (line.substring(line.indexOf("blocE")+15)).indexOf("#")).equals(rs.getString("K_PARAM"))){
line = line.replace(line.substring(line.indexOf("blocE") + 15, line.indexOf("blocE") + 15 + (line.substring(line.indexOf("blocE")+15)).indexOf("#")),rs.getString("L_PARAM") );
}
}
}
return marqueCarte;
}
}
}
}
对于你的第二个问题,我得到了一个更具可读性和可修改性的解决方案。 (我仍然不确定你的第一个是什么)
使用正则表达式和模式你可以实现你想要的替换。
假设您要搜索文本 "blocE" 后跟 15 个字符,同时搜索 rs.getString("K_PARAM")
中包含的文本加上“#”
我们可以将您搜索的内容建模为这样的模式
"(blocE)(.{15})(" + key + "#)"
括号允许我们在正则表达式中建立不同的组。
Group 1 - blocE
Group 2 - 15 characters
Group 3 - key + #
作为组 0 的完整匹配表达式。
了解这一点后,您可以使用以下代码进行替换
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) {
String key = "KEY"; // rs.getString("K_PARAM")
String value = "VALUE"; // rs.getString("L_PARAM")
Pattern pattern = Pattern.compile("(blocE)(.{15})(" + key + "#)");
String input ="helloworldblocE111111111111111KEY#blocE111111111111111KEY";
Matcher m = pattern.matcher(input);
if (m.find()) {
String text2replace = m.group(0);
String replacement = m.group(1) + m.group(2) + value;
System.out.println(input.replaceFirst(text2replace, replacement));
}
}
}
如果你的图案改变了,你只需要改变一根线,你不用担心indexOf
.