在一个文件中一步读写两个文件

问题描述 投票:0回答:1

我正在做一个 Spring Batch 项目,其中我必须读取和修改几个 TXT 文件并将它们写入 JSON 格式的新文件中。我为每个文件创建了我的步骤,它们是一个接一个地编写的。然而,最后两个有一个链接、城市和历史文件。有些城市是有历史的,而每个城市如果有一个历史与它的邮政编码相同,那么它的历史就按照这个来重写。我有点卡住了,我不知道是否应该为每个步骤重写一个步骤,或者是否应该在同一步骤中执行这两个步骤。目前,我有这个:


  @Bean
  public Job runjob(JobRepository jobRepository, PlatformTransactionManager txManager) throws Exception{
    return new JobBuilder("runJob", jobRepository)
        .start(stepCountry(jobRepository,txManager))
        .next(stepRegion(jobRepository,txManager))
        .next(stepDepartment(jobRepository,txManager))
        .next(stepCity(jobRepository,txManager))
        .next(stepHistorique(jobRepository,txManager))
        .build(); 
}

目前,我所有的

@Bean
都在一个类配置中

  @Bean
  public Step stepCity(JobRepository jobRepository, PlatformTransactionManager txManager)throws Exception{
    return new StepBuilder("stepCity")
            .repository(jobRepository)
            .<City, City>chunk(25)
            .reader(readerCity())
            .processor(processorCity())
            .writer(writerCity())
            .transactionManager(txManager)
            .build();
  }

  @Bean
  public Step stepHistorique(JobRepository jobRepository, PlatformTransactionManager txManager)throws Exception{
    return new StepBuilder("stepHistorique")
            .repository(jobRepository)
            .<Historique, Historique>chunk(25)
            .reader(readerHistorique())
            .processor(processorHistorique())
            .writer(writerHistorique())
            .transactionManager(txManager)
            .build();
  }

我没有放置与我的处理器和其他文件有关的内容,因为它对于我当前想做的事情并不重要


@Bean
  public ItemReader<City> readerCity() throws Exception{
    FlatFileItemReader<City> readerCity = new FlatFileItemReader<City>();
    readerCity.setLineMapper(new DefaultLineMapper() {{
      setLineTokenizer(new DelimitedLineTokenizer() {{
        setNames(new String[]{"typecom","com","reg","dep","arr","tncc","ncc","nccenr","libelle","can","comparent"});
      }});
      setFieldSetMapper(new BeanWrapperFieldSetMapper<City>() {{
        setTargetType(City.class);
      }});
    }});
    readerCity.setResource(new ClassPathResource("documents/Cities.txt"));
    return readerCity;
  }

  @Bean
  public ItemReader readerHistorique() throws Exception{
    FlatFileItemReader readerHistorique = new FlatFileItemReader();
    readerHistorique.setLineMapper(new DefaultLineMapper() {{
      setLineTokenizer(new DelimitedLineTokenizer() {{
        setNames(new String[]{"mod","date_eff","typecom_av","com_av","tncc_av","ncc_av","nccenr_av","libelle_av","typecom_ap","com_ap"
            ,"tncc_ap","ncc_ap","nccenr_ap", "libelle_ap"});
      }});
      setFieldSetMapper(new BeanWrapperFieldSetMapper() {{
        setTargetType(Historique.class);
      }});
    }});
    readerHistorique.setResource(new ClassPathResource("documents/HistoriqueCities.txt"));
    System.out.println(readerHistorique);
    return readerHistorique;
  }

我认为每个人都有必要拥有一个

ItemReader

  @Bean
  public ItemWriter<City> writerCity() {
    JsonFileItemWriter<City> writerCity = new JsonFileItemWriter<>(
        new FileSystemResource("src/main/java/output/Insee.json"),
        new JsonObjectMarshaller<City>() {
          @Override
          public String marshal(City object) {
            try {
              ObjectMapper mapper = new ObjectMapper();
              mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
              return mapper.writeValueAsString(object);
            } catch (JsonProcessingException e) {
              e.printStackTrace();
              return null;
            }
          }
        }) {
      @Override
      public void open(ExecutionContext executionContext)
          throws ItemStreamException {
        super.open(executionContext);
        try {
          getOutputState().write(",{Cities: }[");
        }
        catch(IOException e) {
          throw new RuntimeException(e);
        }
      }
    };
    writerCity.setResource(new FileSystemResource("src/main/java/output/Insee.json"));
    writerCity.setAppendAllowed(true);
    writerCity.setJsonObjectMarshaller(new JsonObjectMarshaller<City>() {
      @Override
      public String marshal(City item) {
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("status", item.getTypecom());
        map.put("insee", item.getCom());
        map.put("parent", item.getComparent());
        map.put("country", item.getCountry());
        map.put("dept", item.getDep());

        return map.toString();
      }
    });
    return writerCity;
  }

@Bean
  public ItemWriter<Historique> writerHistorique() {
    JsonFileItemWriter<Historique> writerHistorique = new JsonFileItemWriter<>(
        new FileSystemResource("src/main/java/output/Insee.json"),
        new JsonObjectMarshaller<Historique>() {
          @Override
          public String marshal(Historique object) {
            try {
              ObjectMapper mapper = new ObjectMapper();
              mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
              return mapper.writeValueAsString(object);
            } catch (JsonProcessingException e) {
              e.printStackTrace();
              return null;
            }
          }
        }) {
      @Override
      public void open(ExecutionContext executionContext)
          throws ItemStreamException {
        super.open(executionContext);
        try {
          getOutputState().write(",{Historique: } [");
        }
        catch(IOException e) {
          throw new RuntimeException(e);
        }
      }
    };
    writerHistorique.setResource(new FileSystemResource("src/main/java/output/Insee.json"));
    writerHistorique.setAppendAllowed(true);
    writerHistorique.setJsonObjectMarshaller(new JsonObjectMarshaller<Historique>() {
      @Override
      public String marshal(Historique item) {
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("parent", item.getParent());
        map.put("typecom_av", item.getTypecom_av());
        map.put("mod", item.getMod());
        map.put("nccenr_av", item.getLibelle_av());
        map.put("nccenr_av", item.getLibelle_ap());
        map.put("date_eff", item.getDate_eff());
        return map.toString();
      }
    });
    return writerHistorique;
  }

我不知道他们是否应该每个人都有自己的

ItemWriter
,或者我是否应该将它们写在一个中。城市和历史各有其阶级

json spring-boot spring-batch
1个回答
0
投票

您是否尝试实现自己的 ItemReader 将这两个文件获取到您需要写入的记录?

© www.soinside.com 2019 - 2024. All rights reserved.