2017-04-11 32 views
0

タブ区切り文字列を含む入力ファイルがあります。いくつかの行には複数の連続したタブがあるかもしれません。RegexLineTokenizerでタブ区切り文字列にregexを使用する

私は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]+)")が動作するはずです。

関連する問題