0

我的项目有这个要求,用户上传一个 CSV 文件,该文件必须被推送到 sql server 数据库。我知道我们可以使用 Spring 批处理来处理大量记录。但是我找不到任何教程/示例代码来满足我的这个要求。我遇到的所有教程都只是硬编码了 CSV 文件名和内存数据库,如下所示:

https://spring.io/guides/gs/batch-processing/

用户输入文件在计划时间在共享驱动器位置可用,文件名前缀为例如:stack_overlfow_dd-MM-yyyy HH:mm,每天我如何每 5-10 分钟轮询网络共享驱动器,每天至少一小时如果它与正则表达式匹配,则上传到数据库。如何首先从共享位置获取 csv 文件并将其存储在内存或某处,然后配置 Spring Batch 以将其作为输入读取。这里的任何帮助将不胜感激。提前致谢

4

3 回答 3

1

我遇到的所有教程都只是硬编码了 CSV 文件名和内存数据库

您可以在此处的官方 repo 中找到示例。这是一个示例,其中输入文件名不是硬编码而是作为作业参数传递的。

如何首先从共享位置获取 csv 文件并将其存储在内存或某处,然后配置 spring batch 以将其读取为输入。

您可以分两步进行:在本地下载文件,然后将其读取/处理/写入数据库(请参阅https://stackoverflow.com/a/52110781/5019386)。

如果网络共享驱动器与正则表达式匹配然后上传到数据库,我如何每天至少每 5-10 分钟轮询一小时网络共享驱动器。

一旦你定义了你的工作,你可以安排它在你想要的时候运行:

  • Quartz这样的调度程序
  • 或使用 Spring 的任务调度功能。
  • 或者结合使用 Spring Integration 和 Spring Batch。Spring 集成将轮询目录,然后在适当的时候启动 Spring Batch 作业。此处描述了此方法。

有关作业调度的更多详细信息,请点击此处

于 2018-09-03T08:41:57.353 回答
0

我相信您的问题已经在这里得到解答。

问题的作者甚至上传了他的工作结果的存储库: https ://github.com/PriyankaBolisetty/SpringBatchUploadCSVFileToDatabase/tree/master/src/main/java/springbatch_example

您可以使用 JCIFS API 方法SmbFile.listFiles(String wildcard)检索和过滤共享驱动器中的文件列表。

于 2018-09-01T19:30:16.127 回答
0

您可以制作一个服务层,可以处理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";
 }
于 2018-09-01T19:34:45.290 回答