1

テキストファイルのデータがどのように見えるかを投稿することから始めます。これはわずか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

テキストの各小さなセクションは、テキストファイルの1行にあり、何らかの理由で質問形式で表示されない多くのスペースで区切られています。テキストの最初のセクションを、取得しようとしているデータの例として使用します。

これがファイルから取得したいデータです、、、、、Fridayそして行5:00の読み取り11:59を無視します。テキストのセクションの2行目のすべての情報も無視されますが、テキストファイル自体では無視されます。すべて1行で。次に、このデータを使用して、各部分を変数に保存します。または、代わりに、データの一部が次のようにフォーマットされることがあります。、、正規表現がこれらのいずれかを検出した場合、前後のその行のすべてのデータを無視できます。STH 1102HOLD DO NOT BOOKHOLD DO NOT BOOKDO NOT BOOKHOLD - DO NOT BOOK

また、PMが含まれている時間を取得し、24時間形式になるように12を追加したいと思います。

これが私が現在完全に行を読んでいる方法です。そして、ユーザーがscheduleTxt JTextfieldにパスを入力したら、この関数を呼び出すだけです。各行を正常に読み取って印刷できます。

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ドライバー

4

2 に答える 2

3

それらはフィールド間のタブのように見えます。私があなたなら、正規表現以外のテキスト操作を使用して、\t文字の 3 行ごとに最初の行を分割します。それ以上の処理は必要STH 1102ありHOLD DO NOT BOOKません。

Friday5: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)"。2 番目のパターンは、キャプチャ グループ 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し、右側で説明した方法を使用します。左側の部分を分割し,て、曜日を見つけることができます。

于 2011-09-15T14:24:46.167 に答える
0

StringTokenizerまたはString.split()を使用してテキストを分割し、文字列内の位置によって各セクションにアクセスする価値があると思います。正規表現は同じように壊れやすく、書くのがはるかに複雑になります。

于 2011-09-15T14:25:44.133 に答える