вырезать данные из текстового файла - PullRequest
1 голос
/ 14 сентября 2011

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

Пятница, 9 сентября 2011
-STV 101 -------- 05:00 - 23:59 Отчет SSB 4185 Отпечатано 08.08.2011 в 2: 37

0-AH 104 --------07: 00 - 23:00 Отчет за спортзал, напечатанный 9/08/2011 в 2:37

-BG 105 -------- 07:00 - 23:00 SH GREAT HALL ОтчетНапечатано 08.09.2011 в 2: 37

. Что я хочу сделать с этим текстовым файлом, так это игнорировать первую строку с датой на ней, а затем игнорировать «-» на следующей строке, но читатьв «STV 101», «5:00» и «23:59» сохраните их в переменные, а затем проигнорируйте все остальные символы в этой строке, а затем продолжите для каждой строки после этого.

Вот как я сейчас читаю строки целиком.И тогда я просто вызываю эту функцию, как только пользователь поместил путь в поле scheduleTxt JText.Он может читать и печатать каждую строку в порядке.</p> <pre>public void readFile () throws IOException { try { FileInputStream fstream = new FileInputStream(scheduleTxt.getText()); DataInputStream in = new DataInputStream(fstream); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String strLine; while ((strLine = br.readLine()) != null) { System.out.println (strLine); } in.close(); } catch (Exception e){//Catch exception if any System.err.println("Error: " + e.getMessage()); } }

ОБНОВЛЕНИЕ: оказывается, мне также нужно убрать пятницу из верхней строки и также поместить его в переменную. Спасибо!Говядина.

1 Ответ

3 голосов
/ 14 сентября 2011

Тщательно не проверял, но это регулярное выражение собирало информацию, которая вам нужна в группах 2, 5 и 7: (Предполагая, что вас интересует только «AH 104» в примере «0-AH 104--» - ") ^(\S)*-(([^-])*)(-)+((\S)+)\s-\s((\S)+)\s(.)*

    String regex = "^(\\S)*-(([^-])*)(-)+((\\S)+)\\s-\\s((\\S)+)\\s(.)*";
    Pattern pattern = Pattern.compile(regex);
    while ((strLine = br.readLine()) != null){
        Matcher matcher = pattern.matcher(strLine);
        boolean matchFound = matcher.find();
        if (matchFound){
            String s1 = matcher.group(2);
            String s2 = matcher.group(5);
            String s3 = matcher.group(7);
            System.out.println (s1 + " " + s2 + " " + s3);
        }

    }

Выражение может быть настроено на группы без захвата, чтобы захватить только ту информацию, которую вы хотите.

Объяснение элементов регулярного выражения:

  1. ^(\S)*- Соответствует группе непробельных символов, оканчивающихся на -. Примечание : вместо этого могло бы быть ^(.)*-, оно не будет работать, если перед первым -.
  2. (([^-])*) Соответствует группе каждого символа, кроме -.
  3. (-)+ Соответствует группе из одного или нескольких -.
  4. ((\S)+) Соответствует группе из одного или нескольких непробельных символов. Это захвачено в группе 5.
  5. \s-\s Соответствует группе пробелов, за которой следует -, за которой следуют пробелы.
  6. '((\ S) +)' То же, что и 4. Это снимок в группе 7.
  7. \s(.)* Соответствует пробелу, за которым следует все, что будет пропущено.

Более подробную информацию о регулярном выражении можно найти в этом руководстве . Есть также несколько полезных листовок вокруг. При проектировании / отладке выражения инструмент тестирования regexp также может оказаться весьма полезным.

...