Я пытаюсь отфильтровать файлы по дате - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь отфильтровать файлы по дате и прочитать каждый файл.У меня есть метод find (), который читает каждое имя файла, и он возвращает файлы, начинающиеся с «B» в массиве.Второй метод filesort () возвращает все даты файла из имени файла, отправленного методом find ().В основном методе я хочу прочитать файл к определенной дате, которую я даю.если все файлы имеют одинаковую дату, он читает все файлы.Тем не менее, из файлов, один из файлов имеет другую дату, он выдаст ошибку.

public static String[] find(String rootPath){

   File root = new File(rootPath);
   // Filter files whose name start with "B"
   FilenameFilter beginswithm = new FilenameFilter() {
       public boolean accept(File directory, String filename) {
           return filename.startsWith("B");
       }
   };
   // array to store filtered file names
   String[] files = root.list(beginswithm);
   String[] no = { "nofile" };
   if (files == null) {
       return no;
   }  
   return files;

}

   public String filesort() throws ParseException {
   String path = "C:";
   String [] filesList = find(path);
   for (String file : filesList) {
       File st = new File(file);
       String name=st.getName();
       name= name.replaceAll("\\D+", "");
       String Datename = name.substring(0, 8);
       DateFormat formatter = new SimpleDateFormat("yyyymmdd");
       Date date = (Date)formatter.parse(Datename);
       SimpleDateFormat newFormat = new SimpleDateFormat("mm/dd/yyyy");
       String finalString = newFormat.format(date);
       return finalString;
   }
   return "error";

}

           public static void main(String[] args){
   String path = "C:";
   String [] filesList = find(path);
       for (String file : filesList) {
   if(filesort().equals("04/17/2019"))//to read all files that has 04/17/2018
    {
   reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(path + "//" +file))));
       String content;
       while ((content = reader.readLine()) != null) {
           System.out.println(content);
           }  
   }
       else if (!filesort().equals("04/17/2019")||filesort()==null ) {
           System.out.println("incorect date");
       }

}

this are the files I'm trying to read
 BProce.Arr.20190416.server10.gz
 BProce.Arr.20190417..ball10.gz
 BProce.Arr.20190417.ball23.gz

, поскольку первый файл 16.04.2009, он выбрасывает неправильную датуЕсли у 3 из них есть 17.04.2009, он будет читать без проблем.но сейчас я хочу прочитать только файл с датой 04/17/2019

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Чтобы найти файл, имя которого начинается с буквы «B» и содержит конкретную дату, просто следуйте этой процедуре.

Вы можете найти все файлы, используя этот код с классом File.

public File[] find(String path) {
    File dir = new File(path);
    File[] listOfFiles = null;
    if (dir.isDirectory()) {
         listOfFiles = dir.listFiles();
    }

    return fileList;
}

Из этого списка файлов вы можете получить имя файла, затем проверьте, что имя файла начинается с 'B' и проверьте, содержит ли он конкретную дату. Строковый объект имеет метод startWith (). Вам не нужно менять строку даты как объект Date. Просто вы можете проверить, содержит ли имя файла строку даты или нет.

1 голос
/ 20 апреля 2019

Никогда не используйте ужасные классы Date, DateFormat или SimpleDateFormat.Используйте только java.time классы.

Ответ от Rishoban выглядит правильно.Добавьте к этому это обсуждение даты разбора.

Спросите, представляет ли каждый объект File файл в сравнении с каталогом, вызвав File::isFile.Вызовите File::getName, чтобы получить String с текстом имени файла.Затем используйте String::startsWith и String::substring для анализа имени файла.Вытащите текст возможной даты.Подтвердите, пытаясь проанализировать текст как LocalDate.Определите DateTimeFormatter с шаблоном форматирования, соответствующим ожидаемым данным.

LocalDate targetDate = LocalDate.of( 2019 , Month.APRIL , 17 ) ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
int lengthOfExpectedDateInput = 10 ; // "01/23/2019" is 10 characters long.
String fileName = file.getName() ;
if( file.isFile() && fileName.startsWith( "B" ) ) {
    String possibleDateInput = fileName.substring( 1 , 1 + lengthOfExpectedDateInput ) ;  // Annoying zero-based index counting where 1 means the 2nd position. 
    try {
        LocalDate ld = LocalDate.parse( possibleDateInput , f ) ;  // Parse string as a `LocalDate` object. If input fails to match formatting pattern, a `DateTimeParseException` is thrown.
        if( ld.isEqual( targetDate ) ) {
            // Handle a valid file with expected file name.
            …
        }
    } catch ( DateTimeParseException e ) {
        // Handle unexpected file name.
        …
    }
}

Кстати, обучите издателя этих имен файлов стандарту ISO 8601 .Дата должна быть в формате ГГГГ-ММ-ДД.

Ваш вопрос действительно дубликат многих других.Переполнение стека поиска перед публикацией.

1 голос
/ 19 апреля 2019

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

  1. Чтение имени файла из каталога. здесь пример того, как это сделать
  2. Сохранение имен в ArrayList
  3. Сортировка ArrayList с использованием коллекций , следующая ссылка поможет вам
  4. Теперь вы отсортировали имена каталогов, когда вам нужен доступ, просто получите доступ к элементу ArrayList и используйте его для доступа к реальному файлу

Happy Coding, пожалуйста, дайте мне знать, если у вас все еще есть проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...