2017-06-06 37 views
0

我有一個文件,其中包含以逗號(「,」)分隔的值(用戶ID)列表,如下所示。彈簧批 - 逗號分隔值 - 保存在數據庫中

111,222,333,444,555,777 ............

該文件包含數以百萬計的這樣的記錄,我想這些值保存到一個列在RDBMS表。 我試着用DelimitedLineTokenizer來解析數據。

問題是「DelimitedLineTokenizer」只考慮一行中的一個條目,其餘的值將被忽略。第一個條目(「111」)被保存,同一行中的其餘值將被忽略。如果存在第二行,則第二行中的第一個元素將被保存,並且會被忽略。

有沒有一種方法可以從一行中標記所有逗號分隔值並將其全部保存到數據庫中?

查詢結果如下。 INSERT INTO用戶(id)VALUES(:userid)。

我使用下面的代碼來解析文件並將其保存在數據庫中。

public FlatFileItemReader<User> reader() { 

    FlatFileItemReader<User> reader = new FlatFileItemReader<User>(); 
    DelimitedLineTokenizer reader = new DelimitedLineTokenizer(","); 
    reader.setNames(new String[] {「userid」}); 

    blah…blah….blah…. 

    reader.setLineMapper(new DefaultLineMapper<User>() { 
      { 

       setLineTokenizer(reader); 
       setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() { 
        { 
         setTargetType(User.class); 
        } 
       }); 
      } 
     }); 
     return reader; 
    } 




@Bean 
    public UserItemProcessor processor() { 
       return new UserItemProcessor(); 
    } 

@Bean 
public Job importUserJob(JobCompletionNotificationListener listener) { 

     return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).listener(listener) 
       .flow(step1()).end().build(); 
    } 

    @Bean 
    public Step step1() { 

     return stepBuilderFactory.get("step1").<User, User> chunk(5).reader(reader()).processor(processor()) 
       .writer(writer()).build(); 
    } 

回答

0

基本上,你有兩個目標對象的分隔符 - 逗號&新行。因此,無論是編寫自定義閱讀器都適用於兩個分隔符,還是需要預處理文件以將其轉換爲標準格式。

在我看來,你最好通過預處理文件來替換所有的逗號和換行符。

您可能會保留原始文件並在新的臨時文件中創建預處理數據。

您可以將其作爲單獨的彈簧批處理步驟(不建議由於文件大小而定),或者它將作爲計劃作業,然後可能會在啓動腳本中執行。

Replace comma with newline in java

How to break lines at a specific character in Notepad++?

Notepad++ find and replace string with a new-line

Replace comma with new line in a text file using tr in Linux