我寫了一些代碼,通過檢查每個字段對照某些正則表達式來驗證逗號分隔文件的內容 - 導致我悲傷的特定正則表達式是一個非常基本的日期正則表達式(\\d{2}/\\d{2}/\\d{2}
) 。如果在該字段中的數據不匹配,它應該寫出到一個單獨的文件指示它需要檢查,例如:機器之間的Java jar執行差異
private static int DATE_FIELD = 5;
File input = new File("input.txt");
Pattern p = Pattern.compile("\\d{2}/\\d{2}/\\d{2}");
BufferedReader reader = new BufferedReader(new FileReader(input));
String line = reader.readLine();
while(line != null){
String[] splitLine = line.split(",");
Matcher m = p.matcher(splitLine[DATE_FIELD]);
if(!m.matches) {
// write warning to separate file
}
line = reader.readLine();
}
此代碼被編譯爲一個較大的JAR文件的一部分,該安裝在辦公室的4臺電腦(我的和其他三臺)上。 jar文件是通過一個由單獨的程序進行的shell調用調用的,並傳入相關參數。在我們將數據導入到數據庫之前,這是QC檢查的一部分,並且日期是必填字段,因此如果日期字段留空,則應將其標記爲檢查。
我使用的正則表達式不應允許空白日期通過,並且當我在我的機器上運行它時,它會正確標記缺失的日期。但是,在我的同事機器上,空白日期不會被標記,就好像該字段沒有被檢查一樣,當文件被導入到數據庫時導致了一點悲傷。
換句話說,我們的機器之間存在一些差異,導致代碼在機器上錯誤地執行,但不是我的機器。所有的機器都有Java 8(不確定究竟是哪個版本,但它們都應該是相同的版本)。怎麼可能?
我的猜測是,你不讀文件你認爲你正在閱讀,或者你沒有正確寫出警告,或者你沒有將它們寫入你認爲的文件。添加日誌記錄語句,顯示文件的絕對路徑,正在檢查的行的值等。 –
如果包含'splitLine'方法的代碼,這將有所幫助。此外,一些示例輸入將會很有用。另外,您的所有同事都使用您使用的相同操作系統嗎?這比Java版本更重要,因爲'FileReader'使用系統的默認字符集。 – VGR
@VGR'splitLine'是'java.String.split()'的結果。但我認爲GKR幫助我確定了根本原因。 – NAMS