我的项目有这个要求,用户上传一个必须被推送到sql server数据库的CSV文件。我知道我们可以使用Spring批处理大量记录。但我无法找到我的这个要求的任何教程/示例代码。我遇到的所有教程都硬编码了CSV文件名和内存数据库,如下所示:
https://spring.io/guides/gs/batch-processing/
用户输入文件在计划时间的共享驱动器位置中具有文件名前缀,例如:stack_overlfow_dd-MM-yyyy HH:mm,每天如何每天至少每5分钟轮询网络共享驱动器一小时如果它与正则表达式匹配,则上传到数据库。如何从共享位置首先获取csv文件并将其存储在内存或某处,然后配置spring批处理以将其作为输入读取。任何帮助在这里将不胜感激。提前致谢
我遇到的所有教程都只是硬编码了CSV文件名和内存数据库
你可以在官方repo here找到样品。 Here is an example,输入文件名未经过硬编码,但作为作业参数传递。
如何从共享位置首先获取csv文件并将其存储在内存或某处,然后配置spring批处理以将其作为输入读取。
您可以分两步进行:在本地下载文件,然后读取/处理/写入数据库(请参阅https://stackoverflow.com/a/52110781/5019386)。
如果与正则表达式匹配,则如何每天至少每5分钟轮询网络共享驱动器一小时,然后上传到数据库。
一旦定义了作业,就可以安排它在您想要的时候运行:
关于工作安排here的更多细节。
您可以创建一个服务层来处理excel文件并从文件中读取数据并构造java对象以保存到DB中。在这里,我使用apache POI来解析Excel数据并从excel表中读取。
public class FileUploadService {
@Autowired
FileUploadDao fileUploadDao;
public String uploadFileData(String inputFilePath) {
Workbook workbook = null;
Sheet sheet = null;
try {
workbook = getWorkBook(new File(inputFilePath));
sheet = workbook.getSheetAt(0);
/*Build the header portion of the Output File*/
String headerDetails = "EmployeeId,EmployeeName,Address,Country";
String headerNames[] = headerDetails.split(",");
/*Read and process each Row*/
ArrayList < ExcelTemplateVO > employeeList = new ArrayList < > ();
Iterator < Row > rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
//Read and process each column in row
ExcelTemplateVO excelTemplateVO = new ExcelTemplateVO();
int count = 0;
while (count < headerNames.length) {
String methodName = "set" + headerNames[count];
String inputCellValue = getCellValueBasedOnCellType(row, count++);
setValueIntoObject(excelTemplateVO, ExcelTemplateVO.class, methodName, "java.lang.String", inputCellValue);
}
employeeList.add(excelTemplateVO);
}
fileUploadDao.saveFileDataInDB(employeeList);
} catch (Exception ex) {
ex.printStackTrace();
}
return "Success";
}
我相信你的问题已经回答了here。
该问题的作者甚至上传了他的工作成果库:https://github.com/PriyankaBolisetty/SpringBatchUploadCSVFileToDatabase/tree/master/src/main/java/springbatch_example
您可以使用JCIFS API方法SmbFile.listFiles(String wildcard)在共享驱动器中检索和过滤文件列表。