Browse Source

添加txt文件读取

java8
文宽 史 2 years ago
parent
commit
fd43e79c58
  1. 78
      src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java
  2. 2
      src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java
  3. 220
      src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java
  4. 2
      src/main/resources/application-dev.yml

78
src/main/java/com/xujie/sys/modules/reader/controller/GetInformationForExcelController.java

@ -8,6 +8,12 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RequestMapping("getInformation")
@RestController
@Slf4j
@ -22,13 +28,69 @@ public class GetInformationForExcelController {
return R.ok();
}
// public static void main(String[] args) throws Exception {
public static void main(String[] args) throws Exception {
String filePath ="E:\\file\\cs.tff";
int startLine = 15; // 第一次读取开始的行数
int firstReadLines = 41;
int columnInterval = 11;
try {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line;
List<String> list=new ArrayList<>();
// 第一次读取从第 15 行开始的 41 行数据
for (int i = 1; i < startLine; i++) { //跳过前面的15行
line=reader.readLine();
}
for (int i = 0; i < firstReadLines; i++) {
line = reader.readLine();
if (line != null) {
// 处理当前行数据
list.add(line);
}
}
// 移动到下一列
for (int i = 0; i < columnInterval; i++) {
line = reader.readLine();
}
// String filePath ="E:\\file\\cs.tff";
// BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
// String line;
// while ((line=bufferedReader.readLine())!=null){
// System.out.println(line);
// }
// }
// 每隔 11 行读取往下 41 行的数据
while ((line = reader.readLine()) != null) {
// 从当前行开始读取指定行数
for (int i = 0; i < firstReadLines; i++) {
if (line != null) {
// 处理当前行数据
list.add(line);
}
line = reader.readLine();
}
// 移动到下一列
for (int i = 0; i < columnInterval-1; i++) {
line = reader.readLine();
}
}
for (String s : list) {
String[] data = s.split("\t");
System.out.println(data[0]);
System.out.println(data[1]);
System.out.println(data[2]);
System.out.println(data[3]);
System.out.println(data[4]);
System.out.println(data[5]);
System.out.println(data[6]);
System.out.println(data[7]);
System.out.println(data[8]);
System.out.println(data[9]);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

2
src/main/java/com/xujie/sys/modules/reader/entity/EquipmentFolderLocation.java

@ -15,7 +15,9 @@ public class EquipmentFolderLocation {
private String site;
private String buNo;
private String itemNo;
private String backupFolderPath;
//文件编号
private String fileNo;
}

220
src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java

@ -15,7 +15,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -43,15 +47,22 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
//创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(locationList.size());//线程池的最大数量为文件夹的个数
for (EquipmentFolderLocation excel : locationList) {
String folderFiler = excel.getFolderPath();
executorService.submit(() -> {
saveInformation(folderFiler,excel);
try {
//对文件夹下的文件进行读取并保存
saveInformation(excel);
}catch (Exception e){
e.printStackTrace();
}
});
}
//关闭线程
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有任务完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.info("线程池中断异常");
@ -59,7 +70,8 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
}
}
private void saveInformation(String folderFiler,EquipmentFolderLocation excel) {
private void saveInformation( EquipmentFolderLocation excel) throws Exception {
String folderFiler = excel.getFolderPath();
//获取文件夹下所有文件
List<File> files = getExcelFiles(folderFiler);
if (CollectionUtils.isEmpty(files)) {
@ -78,10 +90,11 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
} else {
batchNo = equipments.get(equipments.size() - 1).getBatchNo() + 1;
}
List<EquipmentDataDetail> equipmentDataDetails =new ArrayList<>();
//创建一个list用来存储所有的的excel文件路径
List<String> fileName = new ArrayList<>();
//创建一个list用来存储所有的txt文件路径
List<String> txtName = new ArrayList<>();
for (File file : files) {
//找到.的索引
int dotIndex = file.getName().lastIndexOf(".");
@ -90,7 +103,199 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
if (s.equals("csv")) {
fileName.add(folderFiler + "\\" + file.getName());
}
if (s.equals("tff")) {
txtName.add(folderFiler + "\\" + file.getName());
}
}
//excel(csv)不为空就做新增
if (CollectionUtils.isNotEmpty(fileName)) {
List<EquipmentDataDetail> equipmentDataDetails = saveExcel(fileName, excel, batchNo);
//批量新增
getInformationForExcelMapper.saveByExcels(equipmentDataDetails);
for (String s : fileName) {
deleteBypath(s, excel.getBackupFolderPath());
}
}
//txt(tff)不为空就做新增
if (CollectionUtils.isNotEmpty(txtName)) {
List<EquipmentDataDetail> equipmentDataDetails = saveTxt(txtName, excel, batchNo);
// 创建一个固定大小的线程池这里假设有10个线程
ExecutorService executor = Executors.newFixedThreadPool(equipmentDataDetails.size()/100);
int startList =0;
int endList=100;
for (int i = startList; i < equipmentDataDetails.size(); i= startList) {
if (endList>equipmentDataDetails.size()){
endList = equipmentDataDetails.size();
}
List<EquipmentDataDetail> details = equipmentDataDetails.subList(startList, endList);
startList=startList+endList;
endList=endList+endList;
executor.execute(()->{
//批量新增
getInformationForExcelMapper.saveByExcels(details);
});
}
// 关闭线程池
executor.shutdown();
for (String s : txtName) {
deleteBypath( s, excel.getBackupFolderPath());
}
}
}
//新增完之后把原路径的文件复制到另一个文件并删除原路径的下的文件
private static void deleteBypath(String endPath,String suffixName) throws Exception{
// 创建源文件对象和目标文件夹对象
File sourceFile = new File(endPath);
File destinationDir = new File(suffixName);
// 确保源文件存在且是文件
if (sourceFile.exists() && sourceFile.isFile()) {
// 确保目标文件夹存在且是目录
if (!destinationDir.exists()) {
destinationDir.mkdirs(); // 创建目标文件夹及其父目录
}
// 构建目标文件路径
String destinationPath = suffixName + File.separator + sourceFile.getName();
File destinationFile = new File(destinationPath);
try {
// 复制文件到目标文件夹
Files.copy(sourceFile.toPath(), destinationFile.toPath());
System.out.println("文件复制成功!");
// 删除源文件
if (sourceFile.delete()) {
System.out.println("源文件删除成功!");
} else {
System.out.println("源文件删除失败!");
}
} catch (IOException e) {
System.out.println("文件操作出错:" + e.getMessage());
}
} else {
System.out.println("源文件不存在或不是文件。");
}
}
public static void main(String[] args)throws Exception {
// 源文件路径
String sourcePath = "E:\\file\\cs.tff";
// 目标文件夹路径
String destinationFolder = "E:\\info";
// 创建源文件对象和目标文件夹对象
File sourceFile = new File(sourcePath);
File destinationDir = new File(destinationFolder);
// 确保源文件存在且是文件
if (sourceFile.exists() && sourceFile.isFile()) {
// 确保目标文件夹存在且是目录
if (!destinationDir.exists()) {
destinationDir.mkdirs(); // 创建目标文件夹及其父目录
}
// 构建目标文件路径
String destinationPath = destinationFolder + File.separator + sourceFile.getName();
File destinationFile = new File(destinationPath);
try {
// 复制文件到目标文件夹
Files.copy(sourceFile.toPath(), destinationFile.toPath());
System.out.println("文件复制成功!");
// 删除源文件
if (sourceFile.delete()) {
System.out.println("源文件删除成功!");
} else {
System.out.println("源文件删除失败!");
}
} catch (IOException e) {
System.out.println("文件操作出错:" + e.getMessage());
}
} else {
System.out.println("源文件不存在或不是文件。");
}
}
//对tff文件进行操作
private static List<EquipmentDataDetail> saveTxt(List<String> fileName, EquipmentFolderLocation excel, Integer batchNo) {
List<EquipmentDataDetail> equipmentDataDetails = new ArrayList<>();
for (String s : fileName) {
int startLine = 15; // 第一次读取开始的行数
int firstReadLines = 41;
int columnInterval = 11;
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(s));
String line;
List<String> list = new ArrayList<>();
// 第一次读取从第 15 行开始的 41 行数据
for (int i = 1; i < startLine; i++) {
bufferedReader.readLine(); // 跳过前面的行数
}
for (int i = 0; i < firstReadLines; i++) {
line = bufferedReader.readLine();
if (line != null) {
// 处理当前行数据
list.add(line);
}
}
// 移动到下一列
for (int i = 0; i < columnInterval; i++) {
line = bufferedReader.readLine();
}
// 每隔 11 行读取往下 41 行的数据
while ((line = bufferedReader.readLine()) != null) {
// 从当前行开始读取指定行数
for (int i = 0; i < firstReadLines; i++) {
if (line != null) {
// 处理当前行数据
list.add(line);
}
line = bufferedReader.readLine();
}
// 移动到下一列
for (int i = 0; i < columnInterval-1; i++) {
line = bufferedReader.readLine();
}
}
//对数据进行切割封装
for (String info : list) {
String[] data = info.split("\t");
EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail();
equipmentDataDetail.setEquipmentNo(excel.getEquipmentNo());
equipmentDataDetail.setBuNo(excel.getBuNo());
equipmentDataDetail.setSite(excel.getSite());
equipmentDataDetail.setBatchNo(batchNo);
equipmentDataDetail.setItemNo(excel.getItemNo());
equipmentDataDetail.setFileNo(excel.getFileNo());
equipmentDataDetails.add(equipmentDataDetail);
equipmentDataDetail.setValue0(data[0]);
equipmentDataDetail.setValue1(data[1]);
equipmentDataDetail.setValue2(data[2]);
equipmentDataDetail.setValue3(data[3]);
equipmentDataDetail.setValue4(data[4]);
equipmentDataDetail.setValue5(data[5]);
equipmentDataDetail.setValue6(data[6]);
equipmentDataDetail.setValue7(data[7]);
equipmentDataDetail.setValue8(data[8]);
equipmentDataDetail.setValue9(data[9]);
equipmentDataDetails.add(equipmentDataDetail);
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return equipmentDataDetails;
}
//对excel(csv)文件进行操作
private static List<EquipmentDataDetail> saveExcel(List<String> fileName, EquipmentFolderLocation excel, Integer batchNo) {
List<EquipmentDataDetail> equipmentDataDetails = new ArrayList<>();
//获取每个excel下的所有关于Test的两个值并保存
for (String s : fileName) {
File excelFile = new File(s);
@ -120,14 +325,13 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl<GetInformatio
}
}
}
//批量新增
getInformationForExcelMapper.saveByExcels(equipmentDataDetails);
return equipmentDataDetails;
}
//获取文件夹下的所有文件
private static List<File> getExcelFiles(String folderFiler) {
//创建本地文件夹路径
File file = new File(folderFiler);
//获取本地文件夹下所有excel表格
//获取本地文件夹下所有文件
File[] files = file.listFiles();
List<File> excelFiles = new ArrayList<>();
if (file != null) {

2
src/main/resources/application-dev.yml

@ -46,7 +46,7 @@ task:
data:
site: 2,3 #事业部
eamWorkPlanTime: 0 0 0 * * ? #点检、维保计划自动生成,每天0点执行
getExcelInformation: 0/10 * * * * ? #每十秒读取一次文件
getExcelInformation: 0/30 * * * * ? #每十秒读取一次文件
#--------------------------------------------接口地址和开关控制-------------------------------------------------

Loading…
Cancel
Save