0

次のような簡単なプログラムがあります。

  • javaでtxtファイルを解析する
  • データを UNIX タイムスタンプに変換します
  • 毎秒 1 行の値のみを保持します

その下にコードがあります。txt ファイルの形式は次のとおりです。

21/03/2013 04:18:23 6890 6830 6850 6770 6830 6400 6630 6710 6770 6850 35024 34976 21/03/2013 04:18:23 6910 6800 6850 6770 6820 :18:24 6890 6820 6860 6770 6830 6400 6580 6720 6770 6830 34912 34880 21/03/2013 04:18:24 6860 6840 6840 6770 6830 6390 6660 6700 6700 6740 6890 350080

私のプログラムは、次のようにコードを変換します。

put sensor.rat.128 1364278801 7100 センサー=A

put sensor.rat.128 1364278801 6910 センサー=B

put sensor.rat.128 1364278801 6890 センサー=C

put sensor.rat.128 1364278801 6630 センサー=D

このプログラムは、毎秒 1 行の値しか保持しないという意味で、txt ファイルで非常にうまく機能しますが、異なる txt ファイルに同じ秒の値がある場合、それらを認識できません。

問題は、どのようにすれば、1 秒ごとに複数のファイルにわたって値のリストを 1 つだけ保存するコードを作成できるかということです。皆様のご理解をお願いいたします。

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;


public class Downsampler {


    public static void main(String[] args) throws Exception{

        /*
        * Scans all the files in a specified folder
        * Obtains Cell number from the file name
        */
        String path = "/home/alessandro/Data128prova"; // name of path
        File folder = new File(path);

        for (File file : folder.listFiles()) {
            Scanner s = new Scanner(file);
            ArrayList<String> list = new ArrayList<String>();
                while (s.hasNext()){
                    list.add(s.next());
                }
            s.close();

            //Arraylist to save modified values
            ArrayList<String> ds = new ArrayList<String>();

           int i;
            String app = "";
                for(i=0; i<=list.size()-13; i=i+14){

        //combining the first to values to obtain data  
        String str = list.get(i)+" "+list.get(i+1);

        //------convert data in epoch time
            Date dt= new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(str);
            long epochlong = dt.getTime()/1000;
            String epoch = Long.toString(epochlong);
        //------end conversion data 

                    if (!str.equalsIgnoreCase(app)){
                    //add all the other values to arraylist ds
                    ds.add(epoch);
                    int j;
            for(j=1; j<14; j++){
            ds.add(list.get(i+j));
                        }
                    }
        app = str;
                }

    int k;
        String metric = "sensor.rat.128.riprova"; //name of the metric
    for (k=0; k<=ds.size()-13; k=k+14){
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+2)+" sensor=A");
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+3)+" sensor=B");   
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+4)+" sensor=C");   
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+5)+" sensor=D");
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+6)+" sensor=E");   
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+7)+" sensor=F");   
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+8)+" sensor=G");   
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+9)+" sensor=H");
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+10)+" sensor=I");  
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+11)+" sensor=L");  
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+12)+" sensor=M");  
    System.out.println ("put "+metric+" "+ds.get(k)+" "+ds.get(k+13)+" sensor=N");
    }


    } //end of for  
}
}
4

1 に答える 1

0

Map と時間をキーとして使用して、データセットを保存します。次に解析しているファイルのいずれかでその時点が表示されたときに、新しいデータセットをどのように処理するかを決定できます (削除する、その時点の現在のデータセットで平均化するなど)。Map を使用してデータセットを特定の時間に関連付けるように更新されたコードを次に示します。このコードは、特定の時間に処理済みであることを示すステートメントを出力するだけです。重複を処理するには、独自のコードを挿入する必要があります。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;

public class Downsampler
{

   public static void main(String[] args) throws Exception
   {

        /*
        * Scans all the files in a specified folder
        * Obtains Cell number from the file name
        */
      String path = "/tmp/data"; // name of path
      File folder = new File(path);

      Map<Long, List<String>> timeValuesMap = new HashMap<Long, List<String>>();
      for (File file : folder.listFiles())
      {
         Scanner s = new Scanner(file);
         ArrayList<String> list = new ArrayList<String>();
         while (s.hasNext())
         {
            list.add(s.next());
         }
         s.close();

         //Arraylist to save modified values
         ArrayList<String> ds = new ArrayList<String>();

         int i;
         String app = "";
         for (i = 0; i <= list.size() - 13; i = i + 14)
         {

            //combining the first to values to obtain data
            String str = list.get(i) + " " + list.get(i + 1);

            //------convert data in epoch time
            Date dt = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(str);
            long epochlong = dt.getTime() / 1000;
            String epoch = Long.toString(epochlong);
            //------end conversion data

            if (!str.equalsIgnoreCase(app))
            {
               //add all the other values to arraylist ds
               ds.add(epoch);
               int j;
               for (j = 1; j < 14; j++)
               {
                  ds.add(list.get(i + j));
               }
            }
            app = str;

            if(timeValuesMap.containsKey(epochlong))
            {
               System.out.println("Already processed time: " +  str);
               //do something - ignore values, average across sensor, min/max, etc...
               //newds = doSomeOperation(ds);
               //timeValuesMap.put(epochlong, newds);
            }
            else
            {

               System.out.println("New time: " +  str);
               timeValuesMap.put(epochlong, ds);
            }
         }

         int k;
         String metric = "sensor.rat.128.riprova"; //name of the metric
         for (k = 0; k <= ds.size() - 13; k = k + 14)
         {
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 2) + " sensor=A");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 3) + " sensor=B");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 4) + " sensor=C");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 5) + " sensor=D");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 6) + " sensor=E");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 7) + " sensor=F");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 8) + " sensor=G");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 9) + " sensor=H");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 10) + " sensor=I");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 11) + " sensor=L");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 12) + " sensor=M");
            System.out.println("put " + metric + " " + ds.get(k) + " " + ds.get(k + 13) + " sensor=N");
         }

      } //end of for
   }
}

注: 非常に大きなデータセットの場合、Map 内の項目数が非常に多くなるため、JVM がメモリ不足になる可能性があります。

于 2013-07-21T14:26:29.030 に答える