вырезать данные из текстового файла с помощью регулярных выражений - PullRequest
1 голос
/ 15 сентября 2011

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

Friday, September  9 2011        5:00AM - 11:59PM       STH 1102                HOLD DO NOT BOOK                                                 
Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00AM - 11:00PM       STH 4155 (BOARDROOM)    HOLD - DO NOT BOOK                     
Hold - Do Not Book        Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00AM - 11:59PM       UC 2 (COMPUTER LAB)     HOLD DO NOT BOOK                       
do not book               Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00PM - 11:00PM       AH GYM                  USC ORIENTATION 2011 - REVISED         
USC Orientation 2011      Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1

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

Вот данные, которые я хотел бы получить из файла Friday, 5:00, 11:59, STH 1102, HOLD DO NOT BOOK, а затем проигнорировать чтение строки, всю информацию во 2-й строке части текста тоже игнорировать, но в самом текстовом файле все это в одной строке. и затем с этими данными, я хотел бы сохранить каждый кусок в переменную. Или вместо этого часть данных, которая говорит HOLD DO NOT BOOK, иногда форматируется следующим образом: DO NOT BOOK, HOLD - DO NOT BOOK, если регулярное выражение находит какой-либо из тезисов, оно может игнорировать все данные в этой строке до и после.

Также, если бы я мог, я бы хотел взять времена, в которых есть PM, и добавить к ним 12, чтобы они были в 24-часовом формате.

Вот как я сейчас читаю строки целиком. И тогда я просто вызываю эту функцию, как только пользователь поместил путь в поле scheduleTxt JText. Он может читать и печатать каждую строку в порядке.

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 (str1);      
            }
            in.close();
        }
        catch (Exception e){
            System.err.println("Error: " + e.getMessage());
        }
    }

В этом вопросе я знаю, надеюсь, вы понимаете, о чем я спрашиваю, если что-то неясно, просто спросите: спасибо! Говядина.

Обновление: Я просто подумал, что, возможно, это поможет объяснить мои намерения в отношении этих данных, сначала я буду конвертировать любое время PM в 24-часовой формат, а затем в соответствии с 4-м фрагментом данных ( STH 1102) Я вызываю функцию вставки, которая будет использовать драйвер ODBC для вставки других данных из строки в базу данных

Ответы [ 2 ]

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

Они выглядят как вкладки между полями.Если бы я был тобой, я бы использовал текстовые манипуляции без регулярных выражений, чтобы разделить первую из каждых трех строк на символе \t.Это должно дать вам STH 1102 и HOLD DO NOT BOOK без дальнейшей обработки.

То есть Friday, 5:00 и 11:59.Вы все еще можете получить те, которые работают с текстом: разделите Friday, September на запятую и возьмите первый сегмент, затем разделите 5:00AM - 11:59PM на строку - (дефис с пробелами вокруг нее).

Если вывсе еще хотите регулярные выражения для тех, вы можете использовать "[A-Za-z]+(?=,)" и "(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)", соответственно.Второй шаблон вернет желаемое время в группах захвата 1 и 2.

Регулярное выражение для всего этого, вероятно, не лучший способ сделать это, но это, вероятно, будет работать:

"^([^,]+),.*\\t(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)\\t([^\\t]+)\\t([^\\t]+)$"

Значения, которые вы хотите, будут в группах захвата 1 - 5.

Редактировать:

Поскольку вы указали, что это не вкладки между группами, приведенное выше регулярное выражение не будет работатькак есть.Однако это, вероятно, означает, что поля находятся в фиксированных позициях.Узнайте, с какого индекса начинается каждая группа, затем используйте String.substring, чтобы выбрать все оттуда до следующей группы, и String.trim результат.Затем вы можете обработать части дня недели и времени, как я описал выше: "[A-Za-z]+(?=,)" и "(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)", или манипуляции со строками без регулярных выражений.

Кроме того, если на самом деле есть вкладка передпервое «временное» значение, которое может испортить позиционирование.Разделите строку на этой вкладке и используйте метод substring, который я описал в правой части.Левая часть может быть разделена на ,, чтобы найти день недели.

0 голосов
/ 15 сентября 2011

Я думаю, что стоит разделить текст с помощью StringTokenizer или String.split() и получить доступ к каждому разделу по его позиции в строке.Регулярное выражение будет столь же хрупким и гораздо более сложным для написания.

...