2017-02-22 17 views
0

私はテキストファイルを持っています。ファイルの各行は、| n |で区切られた 'n'個の列を持つレコードを表します。 (パイプ)文字。列の値はint型、string型、date型、timestamp型などです。空の文字列と空白も列の値として使用できます。Javaのレコードのスキーマを確認してください

私は列値のカウントのみを検証しており、データ型の検証は不要です。 5列ごとの

サンプル有効なレコード:

1234|xyz|abc|2016-04-08 11:12:40|234 
1235|efgh|abc|2016-04-09 11:25:40| 
1236|efghij| || 

検証コード:

boolean valid = true; 
String line = buffReader.readLine(); 
String[] tokens = null; 
while (line != null){ 
    tokens = line.split("\\|"); 
    if ((tokens.length==4 || tokens.length==5) && countPipes(line)==4){ 

    } else { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

private int countPipes(String line){ 
    int count = 0; 
    count = line.length() - line.replace("|", "").length(); 
    return count; 
} 

私はコードが良くなることを感じています。 誰かがこのコードを改善する方法を教えてもらえますか?

+0

カラム値にエスケープされた '|'を許可していますか?はいの場合、検証でこれを処理する必要があります。 – dpr

+0

@RealSkepticバグを指摘してくれてありがとう。私はそれを修正しました。 – Marco99

+0

@dpr列の値に "|"確かに。 – Marco99

答えて

1

さて、あなたは4があることを簡単に確認することができますラインのパイプ。正確に4つのパイプがある場合は、5つの列がありますが、これは空でも構いません(許可します)。

while (line != null) { 
    if (countPipes(line) != 4) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

これで、ラインを一切分割する必要はありません。

スプリットについての注意。 2つのパラメータを持つsplitを使用し、負の数を使用すると、分割には空の要素のエントリも含まれます。ここではデモがある:

public class Test { 

    public static void main(String[] args) throws IOException { 
     String line = "A|B|||"; 

     String[] zeroSplit = line.split("\\|"); 
     String[] negativeSplit = line.split("\\|",-1); 

     System.out.println("When split without parameter: " + zeroSplit.length); 
     System.out.println("When split with negative parameter: " + negativeSplit.length); 
    } 
} 

ここで、出力は次のようになります。

When split without parameter: 2 
When split with negative parameter: 5

したがって、この場合には、あなたはあなたの分割が正確に長さが5であることを確認して、同じ結果を得ることができます。

while (line != null) { 
    if (line.split("\\|",-1).length != 5) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 
0

まず、最も重要なのは、比較演算子==ではなく、=(代入演算子)を1つ使用しているため、if文に重大なエラーがあります。コードのクリーンアップについて

:それはわずかな調整だとこれを検証するためのより良い方法はおそらくありますが、それは私の心に入って来た最初のものです:

boolean valid = true; 
String line = buffReader.readLine(); 
while (valid && (line != null)){ 
    String[] tokens = line.split("\\|"); 
    valid = !(tokens.length == 4 || tokens.length == 5); 
    line = buffReader.readLine(); 
} 
+0

平等の欠陥を指摘してくれてありがとう。私はそれを修正しました。 – Marco99

関連する問題