2017-04-11 119 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]+)")应该可以正常工作。