2017-02-22 77 views
0

我有一個文本文件。文件中的每一行都表示一個記錄,其中列的分隔符爲'n'列(管道)字符。列值的類型爲int,字符串,日期,時間戳記等。空字符串和空格也可以作爲列值。檢查java中記錄的模式

我只驗證列值的數量和數據類型的驗證不是必需的。

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

輸入驗證碼:每5列

樣品的有效記錄

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

好了,你可以簡單地檢查有四個排隊中的管道。如果只有四個管道,則有五個列,可能是空的(您允許)。

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

現在你根本不需要拆線。

關於拆分的說明,雖然。如果使用帶有兩個參數的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

首先,也是最重要的:您在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