2017-04-11 42 views
0

我有一個輸入文件包含製表符分隔的字符串。在某些行上可能會有多個連續的選項卡。使用Regex製表符分隔的字符串與RegexLineTokenizer

我試過使用Spring的DelimitedLineTokenizer,但由於有多個選項卡,我不得不考慮切換到RegexLineTokenizer。

在RegexLineTokenizer中,當我做一個setRegex(「\ t +」)時,它無法正確標記行,並失敗ArrayIndexOutOfBoundsException。

我不知道我在這裏做錯了什麼。

下面的代碼:

@Bean 
public FlatFileItemReader<RoutingHubInfoId> routingHubIdReader() { 
    System.out.println("Reading from file"); 
    FlatFileItemReader<RoutingHubInfoId> reader = new FlatFileItemReader<RoutingHubInfoId>(); 
    reader.setResource(new ClassPathResource("NAM_C4_DATA.txt")); 
    DefaultLineMapper<RoutingHubInfoId> lineMapper = new DefaultLineMapper<RoutingHubInfoId>(); 
    RegexLineTokenizer rlt = new RegexLineTokenizer(); 
    rlt.setRegex("\t+"); 
    lineMapper.setLineTokenizer(rlt); 
    lineMapper.setFieldSetMapper(new RoutingHubInfoIdMapper()); 
    reader.setLineMapper(lineMapper); 

    return reader; 
} 

該文件包含以下行(樣本)

abc def ghi 
00089BTT IOIX BRA 
00089BZA BzDSA BRA 

現在,我試圖用另一段代碼,和它的作品。

public class RoutingHubIdReader 
{ 
    public static void main(String[] args) throws IOException, URISyntaxException 
    { 
     File file = new File(ClassLoader.getSystemResource("NAM_C4_DATA.txt").getFile()); 
     if (file.exists()) { 
      System.out.println("File exists!"); 
     } 
     else { 
      System.out.println("File doesnt exist!"); 
     } 
     LineNumberReader lnr = new LineNumberReader(new FileReader(file)); 
     String line; 
     while ((line = lnr.readLine()) != null) { 
      String[] tokens = line.split("\t+"); 
      if (tokens.length != 3) { 
       System.out.println(("Tokens: size: " + tokens.length + " values: " + Arrays.asList(tokens))); 
      } 
     } 

    } 
} 

看起來很簡單我很想念,但不知道。我也嘗試將\t+轉義爲\\t+,但那也沒有效果。

+0

你可以用你正在使用的代碼和你正在嘗試的例子來更新問題嗎? –

+0

不清楚你在做什麼。如果您提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),這將有所幫助。 – freedev

回答

0

使用正則表達式過濾掉數據的線標記器(使用 匹配和不匹配的組)。

你的正則表達式沒有定義任何匹配/不匹配的組,所以它不能工作。
我不能直接嘗試,但rlt.setRegex("([^\t]+)")應該可以正常工作。