gpt4 book ai didi

java - 从文件路径初始化对象变量

转载 作者:行者123 更新时间:2023-12-02 12:12:14 25 4
gpt4 key购买 nike

servername
|-- reports
| |-- ABC
| | |-- COB02May2017
| | | |-- pnlreport.pdf
| | | |-- balancereport.pdf
| | |-- COB03May2017
| |-- CustomerB
| | |-- COB02May2017
| | |-- COB03May2017
| | | |-- balancereport.pdf
| |-- 01CFG
| | |-- COB03Sep2017

我有上面的目录树来保存我的客户报告。

我有以下ReportDeliverable模型:

public class ReportDeliverable {

private String reportId;
private String reportName;
private String customer;
private String format;
private Date cobDate;
}

报告计划:

public class ReportSchedule {

private final String schedule;
private final String reportId;
private final String filePattern;
private final String format;
private final String filePath;

}

我有以下类,负责提供报告可交付对象的列表:

@Service
public class FileServiceImpl implements FileService {


@Value("${reports.source-path}")
private String sourcePath;


@Override
public List<ReportDeliverable> getReportDeliverables(ReportSchedule reportSchedule) {
List<ReportDeliverable> reportDeliverables = new ArrayList<>();
List<Path> filesToProcess = getFilesToProcess(reportSchedule);

filesToProcess.forEach(path -> {
//for each path returned, extract and initialise ReportDeliverable object
ReportDeliverable reportDeliverable = new ReportDeliverable();
//reportDeliverable.setReportName(); > pnlreport.xls
//reportDeliverable.setFormat(); > > PDF
//reportDeliverable.setCobDate(); > 26-SEP-2017
//reportDeliverable.setClient(); > CustomerA
//reportDeliverable.setFilePath(); > \servername\reports\CustomerA\COB26Sep2017\pnlreport.pdf

reportDeliverables.add(reportDeliverable);
});

return reportDeliverables;
}

public List<Path> getFilesToProcess(ReportSchedule reportSchedule) {

String pattern = reportSchedule.getFilePattern(); //e.g. pnlreport
String format = reportSchedule.getFormat(); // PDF

//return full paths from here based on report criteria for COB that is T-1 (day before today). ignore the rest
// e.g. if today is 27/09/2017
//return -> \servername\reports\CustomerA\COB26Sep2017\pnlreport.pdf, \servername\reports\CustomerB\COB26Sep2017\pnlreport.PDF

return path;
}
}

每天都会创建一个名为 COB-{prior-day-date} 的目录,如上面的目录结构。使用 Java 8,

  1. 我需要一些帮助来返回与 ReportSchedules 中保存的条件相关的所有文件路径。我试图在 getFilesToProcess(ReportSchedule reportSchedule)
  2. 的注释中进行解释
  3. 从路径中,我需要初始化 ReportDeliverable 字段,注释中再次解释了 getReportDeliverables(ReportSchedule reportSchedule)

最佳答案

我对你的问题的理解是如何递归地遍历目录结构以查找符合特定模式的文件,该文件的命名方式包括遵循特定格式规则的格式化日期。这是我想出的。有可能进行优化,但这应该是一个起点。

如果我理解错了你的问题,你可以稍微改一下,这样我就可以纠正我的答案。

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;

public class RetrievePathsOfYesterday {

public final static void main(String[] args) {
String pattern = "pnlreport";
String format = "PDF";
String baseDir = "F:/Test";
switch(args.length) {
case 3:
format = args[2];
case 2:
pattern = args[1];
case 1:
baseDir = args[0];
}
File root = new File(baseDir);
File[] customerDirs = root.listFiles(file -> file.getName().toLowerCase(Locale.ENGLISH).startsWith("customer"));
ArrayList<Path> result = new ArrayList<>();
for (int i = 0; i < customerDirs.length; i++) {
result.addAll(getFilesToProcess(customerDirs[i], pattern, format));
}
System.out.println(result);
}

public static List<Path> getFilesToProcess(File baseDir, String pattern, String format) {
pattern = pattern.toLowerCase(Locale.ENGLISH);
format = "." + format.toLowerCase(Locale.ENGLISH);
Calendar now = Calendar.getInstance();
now.add(Calendar.DAY_OF_YEAR, -1);
SimpleDateFormat sdf = new SimpleDateFormat("ddMMMyyyy", Locale.ENGLISH);
File startDir = new File(baseDir, "COB" + sdf.format(now.getTime()));
ArrayList<Path> result = new ArrayList<>();
getFilesToProcess(result, startDir, pattern, format);
return result;
}

private static void getFilesToProcess(List<Path> resList, File baseDir, String pattern, String format) {
System.out.println("processing " + baseDir.getAbsolutePath());
if (!baseDir.exists()) {
return;
}
File[] files = baseDir.listFiles(pathName -> {
System.out.println("filter " + pathName.getName());
if (pathName.isDirectory()) {
return true;
}
if (!pathName.isFile()) {
return false;
}
String name = pathName.getName().toLowerCase(Locale.ENGLISH);
if (!name.startsWith(pattern)) {
return false;
}
if (!name.endsWith(format)) {
return false;
}
return true;
});

for (int i = 0; i < files.length; i++) {
File current = files[i];
System.out.println("Checking " + current.getAbsolutePath());
if (current.isDirectory()) {
getFilesToProcess(resList, current, pattern, format);
continue;
}
resList.add(Paths.get(current.toURI()));
}
}
}

我使用以下目录结构测试了此代码:

kimmerin@harry /cygdrive/f
$ ls -R Test
Test:
CustomerA CustomerB

Test/CustomerA:
COB26Sep2017

Test/CustomerA/COB26Sep2017:
pnlreport.pdf

Test/CustomerB:
COB26Sep2017

Test/CustomerB/COB26Sep2017:
otherreport.PDF

如果您将 Test 替换为 servername/report,这应该与您在问题中描述的结构完全相同。这是使用默认值启动类时的输出:

filter pnlreport.pdf

Checking F:\Test\CustomerA\COB26Sep2017\pnlreport.pdf

processing F:\Test\CustomerB\COB26Sep2017

filter otherreport.PDF

[F:\Test\CustomerA\COB26Sep2017\pnlreport.pdf]

关于java - 从文件路径初始化对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46455722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com