代码之家  ›  专栏  ›  技术社区  ›  Henrique Vital

Spring批处理-如何设置我正在读取到实体中的每个csv文件名?

  •  0
  • Henrique Vital  · 技术社区  · 3 年前

    如何设置我在实体中读取的每个csv文件名并将其发送到处理器,我有以下读取器代码:

    在以下实体中,我有一个字段fileName,我想用我正在读取的当前csv文件名设置它,另一个字段我想用csv数据设置它。

    实体

    @Data
    @AllArgsConstructor
    public class TestDTO {
        private String fileName;
        private String name;
        private String lastName;
    }
    

    密码

    @Configuration
    public class testReader{
        @Bean
        public FlatFileItemReader<TestDTO> csvFileReader() {
            FlatFileItemReader<TestDTO> reader = new FlatFileItemReader<>();
            reader.linesToSkip(1) // Skip header row if needed
            reader.lineMapper(csvLineMapper())
            return reader;
        }
    
        @Bean("testReader")
        public MultiResourceItemReader<testDTO> multiResourceReader() throws IOException {
            Resource[] files = csvFileResource();
            MultiResourceItemReader<testDTO> resourceItemReader = new MultiResourceItemReader<>();
            resourceItemReader.setResources(files);
            resourceItemReader.setDelegate(csvFileReader());
            return resourceItemReader;
        }
    
        @Bean
        public DefaultLineMapper<TestDTO> csvLineMapper() {
            DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
            tokenizer.setNames("Name","Lastname");
    
            BeanWrapperFieldSetMapper<YourDataClass> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
            fieldSetMapper.setTargetType(TestDTO.class);
    
            DefaultLineMapper<TestDTO> lineMapper = new DefaultLineMapper<>();
            lineMapper.setLineTokenizer(tokenizer);
            lineMapper.setFieldSetMapper(fieldSetMapper);
    
            return lineMapper;
        }
    
        @Bean
        public Resource[] csvFileResource() throws IOException {
            // Specify the folder path where your CSV files are generated
            Resource[] resources = new PathMatchingResourcePatternResolver().getResources("file:input/*.csv");
            if (resources.length == 0) {
                throw new FileNotFoundException("No CSV files found in the specified folder.");
            }
            return resources;
        }
    }
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   httPants    3 年前

    您可以使您的TestDTO实现 ResourceAware 界面

    @Data
    public class TestDTO implements ResourceAware {
        private String fileName;
        private String name;
        private String lastName;
    
        public void setResource(Resource resource) {
            this.fileName = resource.getFilename();
        }
    }