2017-02-14 2 views
2

Я написал немного кода, который проверяет содержимое файла с разделителями-запятыми, проверяя каждое поле на некоторое регулярное выражение - конкретное регулярное выражение, которое вызывает у меня горе, является очень простым регулярным выражением даты (\\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 вызывается через вызов оболочки, сделанный отдельной программой, передавая соответствующие параметры. Это часть проверки контроля качества, прежде чем мы импортируем данные в нашу базу данных, а дата - обязательное поле, поэтому, если поле даты оставлено пустым, оно должно быть помечено для проверки.

Регулярное выражение, которое я использовал, не должно пропускать пустую дату, и когда я запускаю его на своей машине, он правильно обозначает отсутствующие даты. Однако на машинах моих коллег пустые даты были как-то не отмечены, как будто это поле вообще не проверялось, что вызвало небольшое горе, когда файл был импортирован в базу данных.

Другими словами, между нашими машинами существует некоторое расхождение, которое вызвало неправильное выполнение кода на своих машинах, но не мое. На всех машинах есть Java 8 (не совсем точно, какая версия, но все они должны быть одинаковой версии). Как это может быть?

+2

Я предполагаю, что вы не читаете файл, который вы что вы читаете, или что вы неправильно пишете предупреждения, или что вы не пишете их в файл, который вы думаете. Добавьте логические инструкции, показывая абсолютные пути файлов, значения проверяемых строк и т. Д. –

+0

Это поможет, если вы включили код для метода splitLine. Кроме того, будет полезно использовать некоторые примеры ввода. Кроме того, все ваши сотрудники используют ту же ОС, которую вы используете? Это важнее, чем версия Java, так как «FileReader» использует кодировку по умолчанию для системы. – VGR

+0

@VGR 'splitLine' является результатом' java.String.split() '. Однако я думаю, что GKR помог мне прибить основную причину. – NAMS

ответ

2
  • Необходимо указать кодировку файлов, которые вы хотите прочитать. [Конструкторы FileReader] обычно используют стандартную кодировку платформы. Поэтому определите фактическое кодирование и используйте что-то вроде new InputStreamReader(new FileInputStream(input), <encoding>)
  • Проверьте версию java для каждой машины. Убедитесь в том, что назначенный Java на самом деле называется
  • Проверьте кодировку файла (ов) сам (UTF-8, CP1252, или ...)
+0

Таким образом, кажется, что этот файл, открытый в TextWrangler, показывает его кодировку как «Western (ASCII)» вместо обычного UTF-8, что, вероятно, является источником моей проблемы. Однако перед обработкой кода выполняется несколько шагов, и исходный файл начинается как UTF-8 ... так что, по-видимому, основная причина лежит в другом месте. Я считаю, что это, вероятно, правильный ответ; Я попытаюсь явно определить кодировку и вернуться, чтобы принять это через некоторое время, и я уверен, что проблема решена. – NAMS

+0

Я попытался, как я сказал выше, но он все еще не решил проблему и требует дальнейшего расследования; однако я принял этот ответ, поскольку я сказал, что буду, поскольку это все еще, вероятно, полезно. – NAMS

Смежные вопросы