navicat导出sql文件按日期删除
有个sql文件很大,数据也不是全都需要,只要测试功能,根据insert into 和所在行的日期进行判断,删除多余数据,这个代码实现删除2022,2023,和2024.10.31之前的数据,简单实现。
会过滤不是日期的哪一行,结果会多括号 懒得全局替换了。
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SqlFilter {
public static void main(String[] args) {
String inputFilePath = "C:\\Users\\test\\Desktop\\a.sql"; // 输入 SQL 文件路径
String outputFilePath = "C:\\Users\\test\\Desktop\\b.sql"; // 输出过滤后的 SQL 文件路径
// 读取并处理文件内容
try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
// 如果行包含 "INSERT INTO",进行日期检查
if (line.startsWith("INSERT INTO")) {
// 使用正则表达式检查日期字段(假设日期格式是 'YYYY-MM-DD HH:MM:SS')
String filteredLine = filterInsertStatement(line);
// 如果该行不符合删除条件,则写入输出文件
if (!filteredLine.isEmpty()) {
writer.write(filteredLine);
writer.newLine();
}
} else {
// 非INSERT INTO语句直接写入
writer.write(line);
writer.newLine();
}
}
System.out.println("过滤完成,结果保存在 " + outputFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
// 过滤 INSERT INTO 语句中的日期字段,删除包含不符合条件的日期的行
private static String filterInsertStatement(String insertStatement) {
// 提取 VALUES 部分
int valuesStart = insertStatement.indexOf("VALUES") + 7;
int valuesEnd = insertStatement.indexOf(");");
if (valuesStart == -1 || valuesEnd == -1) {
return ""; // 无效的插入语句
}
String values = insertStatement.substring(valuesStart, valuesEnd).trim();
String[] valueLines = values.split("\\),\\(");
StringBuilder filteredValues = new StringBuilder();
// 定义不符合条件的日期(2022, 2023, 和 2024年10月31日前)
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String cutoffDateStr = "2024-10-31 23:59:59";
Date cutoffDate = null;
try {
cutoffDate = dateFormat.parse(cutoffDateStr);
} catch (Exception e) {
e.printStackTrace();
}
for (String valueLine : valueLines) {
// 使用正则表达式匹配日期字段(假设日期格式是 'YYYY-MM-DD HH:MM:SS')
Pattern datePattern = Pattern.compile("'(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})'");
Matcher dateMatcher = datePattern.matcher(valueLine);
boolean containsExcludedDate = false;
while (dateMatcher.find()) {
String dateStr = dateMatcher.group(1);
String year = dateStr.substring(0, 4); // 提取年份部分
Date currentDate = null;
try {
currentDate = dateFormat.parse(dateStr);
} catch (Exception e) {
e.printStackTrace();
}
// 判断是否符合删除条件(包含2022或2023年,或2024年10月31号之前的日期)
if (year.equals("2023") || year.equals("2022") || (currentDate != null && currentDate.before(cutoffDate))) {
containsExcludedDate = true;
break; // 如果找到符合条件的日期,跳出循环
}
}
// 如果不包含2023、2022年,且日期不在截止日期之前,则保留该行
if (!containsExcludedDate) {
if (filteredValues.length() > 0) {
filteredValues.append(",\n");
}
filteredValues.append("(").append(valueLine).append(")");
}
}
// 如果没有排除的日期,返回原始语句
if (filteredValues.length() > 0) {
return insertStatement.substring(0, valuesStart) + " " + filteredValues.toString() + " );";
} else {
return ""; // 如果没有有效的值,返回空字符串,表示跳过该行
}
}
}