用Java把两个文件夹下的同名log并把log内的数据(有日期)按日期顺序整合成一个新的txt文档,每个log里大概7万条数据
该回答引用ChatGPT
要实现将两个文件夹下的同名log按日期顺序整合成一个新的txt文档的功能,您可以按照以下步骤操作:
1、获取两个文件夹下的log文件列表:使用Java的File类和listFiles()方法获取两个文件夹下的log文件列表。您可以使用FileFilter来筛选出.log文件。
2、按日期排序:对于每个文件夹下的log文件列表,您可以使用Collections.sort()方法按照文件名的日期排序。您可以使用正则表达式来提取文件名中的日期信息,并将文件名转换为Date类型进行排序。
3、逐个读取log文件并写入新的txt文档:对于排序后的log文件列表,逐个读取每个log文件,并将其写入新的txt文档中。您可以使用Java的BufferedReader和BufferedWriter类来实现文件读写操作。
下面是一个实现上述功能的Java代码示例:
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class MergeLogFiles {
public static void main(String[] args) throws Exception {
// 定义两个log文件夹的路径
String folderPath1 = "D:/logs1";
String folderPath2 = "D:/logs2";
// 定义新的txt文档路径
String outputPath = "D:/merged_logs.txt";
// 获取两个文件夹下的log文件列表
List<File> fileList = new ArrayList<>();
fileList.addAll(getLogFiles(folderPath1));
fileList.addAll(getLogFiles(folderPath2));
// 按日期排序
Collections.sort(fileList, (f1, f2) -> {
Date date1 = getLogDate(f1.getName());
Date date2 = getLogDate(f2.getName());
return date1.compareTo(date2);
});
// 逐个读取log文件并写入新的txt文档
BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath));
for (File file : fileList) {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
reader.close();
}
writer.close();
}
// 获取指定文件夹下的log文件列表
private static List<File> getLogFiles(String folderPath) {
List<File> fileList = new ArrayList<>();
File folder = new File(folderPath);
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".log");
}
});
if (files != null) {
for (File file : files) {
fileList.add(file);
}
}
}
return fileList;
}
// 从log文件名中提取日期信息
private static Date getLogDate(String fileName) throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
int start = fileName.indexOf("log-") + 4;
int end = fileName.indexOf(".log");
String dateString = fileName.substring(start, end);
return dateFormat.parse(dateString);
}
}
先说说我的大致思路,按照流式进行读取,记录时间和数据,在内存中保存时间和行号,通过插入的方式讲流的数据插入文本中
1、可能需要创建两个reader来分别读取两个目录下的log文件;
2、分别读取两个日志文件的一行;
3、解析出每行内容的时间,将时间小的那一行数据写到新文件中;将时间大的那条数据暂存,不做处理;
4、从第三步中,时间小的那个文件中再读取一行数据,解析时间,并与刚才暂存的那条数据的时间进行比较,小的写入文件,大的暂存;
重复3、4步,实现按时间排序。
前提:每个log文件中的数据是按时间排好序的;
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>