-2

ユーザー名と日付が同じである行 1 と行 5 を取りたいのですが、行 1 には時間が含まれており、行 5 には時間が含まれています。これらの 2 行を読み取り、比較して、両方の行に同じユーザー名があるかどうかを確認します。および日付。そうであれば、他のテキストファイルまたはハッシュマップに1行として出力します

このような例:"sangeetha-May 02, 2013 , -in-09:48:06:61 -out-08:08:19:27(JAVAで)

これはテキストファイルの内容です:

line 1. "sangeetha-May 02, 2013 , -in-09:48:06:61
line 2. "lohith-May 01, 2013 , -out-09:10:41:61
line 3 . "sushma-May 02, 2013 , -in-09:48:06:61
line 4. "sangeetha-May 01, 2013 , -out-08:36:38:50
line 5. "sangeetha-May 02, 2013 , -out-08:08:19:27
line 6. "sushma-May 02, 2013 , -out-07:52:13:51
line 7. "sangeetha-Jan 01, 2013 , -in-09:27:17:52-out-06:47:48:00
line 8. "madhusudhan-Jan 01, 2013 , -in-09:38:59:31-out-07:41:06:40

上記のデータは、以下のコードを使用して生成されています

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;

public class FlatFileParser 
{
    public static void main(String[] args)
    {    
        // The stream we're reading from
        BufferedReader in;
        BufferedWriter out1;
         BufferedWriter out2;
        // Return value of next call to next()
        String nextline;
        try 
        {
            if (args[0].equals("1"))
            {
                in = new BufferedReader(new FileReader(args[1]));
                nextline = in.readLine();
                while(nextline != null)
                {
                    nextline = nextline.replaceAll("\\<packet","\n<packet");
                    System.out.println(nextline);
                    nextline = in.readLine();
                }
                in.close();
            }
            else
            {
                in = new BufferedReader(new FileReader(args[1]));
                out1 = new BufferedWriter(new FileWriter("inValues.txt" , true));
                 out2 = new BufferedWriter(new FileWriter("outValues.txt"));
                nextline = in.readLine();
                HashMap<String,String> inout = new HashMap<String,String>();
                while(nextline != null)
                {
                    try
                    {
                        if (nextline.indexOf("timetracker")>0)
                        {
                            String from = "";
                            String indate = "";
                            if (nextline.indexOf("of in")>0)
                            {

                                int posfrom = nextline.indexOf("from");
                                int posnextAt = nextline.indexOf("@", posfrom);
                                int posts = nextline.indexOf("timestamp");
                                from = nextline.substring(posfrom+5,posnextAt);
                                indate = nextline.substring(posts+11, posts+23);
                                String dd = indate.split(" ")[1];
                                String key = dd+"-"+from+"-"+indate;
                                //String key = from+"-"+indate;
                                String intime = "-in-"+nextline.substring(posts+24, posts+35);
                                inout.put(key, intime);    

                            }
                            else if (nextline.indexOf("of out")>0)
                            {
                                int posfrom = nextline.indexOf("from");
                                int posnextAt = nextline.indexOf("@", posfrom);
                                int posts = nextline.indexOf("timestamp");
                                from = nextline.substring(posfrom+5,posnextAt);
                                indate = nextline.substring(posts+11, posts+23);
                                String dd = indate.split(" ")[1];
                                String key = dd+"-"+from+"-"+indate;
                                String outtime = "-out-"+nextline.substring(posts+24, posts+35);
                                if (inout.containsKey(key))
                                {
                                    String val = inout.get(key);
                                    if (!(val.indexOf("out")>0))
                                        inout.put(key, val+outtime);                    
                                }
                                else
                                    inout.put(key, outtime);
                            }
                        }
                    }
                    catch(Exception e)
                    {
                        System.err.println(nextline);
                        System.err.println(e.getMessage());
                    }
                    nextline = in.readLine();    
                }
                in.close();

                for(String key: inout.keySet())
                {
                    String val = inout.get(key);
                    out1.write(key+" , "+val+"\n");
                    System.out.println(key + val);
                }
                out1.close();
            }
        } 
        catch (IOException e)
        {
            throw new IllegalArgumentException(e);
        }
    }
}

説明: これらは従業員のログイン時間とログアウト時間です。ログ ファイルから読み取っていますが、7 行目と 8 行目のように 1 行で適切に表示されるものもあれば、同じ日付の別の行で表示されるものもあります。上記の例のように同じ行に印刷し、出入り時間の両方で単一行に記録されるレコードはそのまま保持する必要があります.... PLZは誰でも助けることができます....!

4

3 に答える 3

1

のファイルのすべての行のリストがあるとしますlstFile

あなたはこれを行うことができます

String output="",line1,line2;
for(int i=0;i<lstFile.size();i++)
{

    line1=lstFile.get(i);
    if(line1.contains("in") && line1.contains("out"))continue;
    for(int j=i+1;j<lstFile.size();j++)
    {
        line2=lstFile.get(j);

        if(line2.contains("in") && line2.contains("out"))continue;

        if(line1.contains(getNameDate(line2)) && line2.contains("out") && line1.contains("in"))
        {
              output+=line1+line2.substring(line2.lastIndexOf(","),line2.length());
              output+=System.getProperty("line.separator");
              break;
        }
    }
}
//output now contains your desired result

以下のメソッドは、名前と日付を取得します

public String getNameDate(String input)
{
    return input.substring(0,input.lastIndexOf(","));
}
于 2013-07-11T04:44:13.523 に答える
0

開始するためのサンプル コードを次に示します。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ParseLogs {

    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            String line;

            br = new BufferedReader(new FileReader("src/main/resources/log.txt"));
            while ((line = br.readLine()) != null) {
                String[] split = line.split(" ");

                if (split.length > 2) {
                    String name = split[2].split("-")[0];
                    name = name.replace("\"", "");
                    System.out.println(name);
                }

                if (split.length > 5) {
                    String date = split[6];
                    System.out.println(date);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

正規表現を使用し、文字列行のパターンを調べて、それらを分割できるようにする必要があるという他の投稿は正しいです。可能であれば、最初にログを標準化して、同様のパターンに適合し、後でデータを操作する必要がないようにしてください。

これがプログラムの出力です

sangeetha
-in-09:48:06:61
lohith
-out-09:10:41:61
.
,
sangeetha
-out-08:36:38:50
sangeetha
-out-08:08:19:27
sushma
-out-07:52:13:51
sangeetha
-in-09:27:17:52-out-06:47:48:00
madhusudhan
-in-09:38:59:31-out-07:41:06:40

エラーのために「name」変数と「date」変数をクリーンアップする必要があることに注意してください。

于 2013-07-11T04:40:02.707 に答える
0

これは基本的なデータ解析です。疑似コードでは、これは私がそれを行う方法です

Create a class that holds 4 valus, Employee, Date, InTime, OutTime
Instantiate a HashMap for all the final log lines
For each log line
    Parse the line using RegEx to find Employee, Date and in and/or out time
    Create the HashKey using Employee + Date
    See if the HashMap already contains such an object, else create one
    Populate with the in and/or out times found on the current line
Done, the HashMap now contains all parsed data.
于 2013-07-11T04:24:57.583 に答える