Как я могу посчитать эти переменные в моей БД? - PullRequest
4 голосов
/ 28 января 2010

Не могли бы вы помочь мне с этой проблемой?

У меня есть 4 переменные

  1. XTSM находится между 0 ~ 200
  2. XTS находится между 0 ~ 2
  3. XRX - 0 ~ 3
  4. XHAN - 0 ~ 7
  5. ZHTYPE является одним из них: (1) TCHF_HLF (2) TCHSD (3) TCHFULL

они связаны с этой формой.

XTSM->XTS->XRX->XHAN->ZHTYPE (Just Logical)

это означает:

  • Каждый XTSM имеет 3 XTS (0-2)
  • Каждый XTS имеет 4 XRX (0-3)
  • Каждый XRX имеет 8 XCHAN (0-7)
  • и каждая строка имеет тип ZHTYPE

У меня есть файл БД с 14000 строками; в этом файле указаны эти переменные, Например, XTSM находится между 0 ~ 200, но обычно это меньше, чем 200, а может быть, например, указано 0 ~ 60, но это никогда не больше, чем 200; и это верно для XTS, XRX и XCHAN, конечно ... поэтому мы должны сделать все переменные динамическими;

это часть файла (например, ОБНОВЛЕНО): http://www.4shared.com/file/210566155/c080d93a/db_online.html

Я хочу получить этот вывод? (Я хочу показать XTSM и XTS для вывода и в фоновом режиме должны вычислить все из них) пожалуйста, помогите мне

----Type------------------Total---------------------Total of ZHTYPE-----------------
XTSM:0/XTS:0               in this case is : 29     TCHF_HLF:28 TCHSD:1 TCHFULL:0
XTSM:0/XTS:1               No. of found   
XTSM:0/XTS:2               No. of found   
XTSM:1/XTS:0               No. of found   
XTSM:1/XTS:1               No. of found   
XTSM:1/XTS:2               No. of found 

Я не знаю, но я думаю, что возможно это; Нет? Это просто псевдокод:

for(i ; i< (Total of XTSM) ; i++){
        for(j ; j< (Total of XTS) ; j++){
            for(k ; k< (Total of XRX) ; k++){
                for(l ; l< (Total of XCHAN) ; l++)
                    Print( Total of XTSM:x/XTS:y);
            }
        }

}

Спасибо за вашу помощь ...

Ответы [ 3 ]

3 голосов
/ 29 января 2010

Пожалуйста, смотрите мое решение ниже. Тестовый файл test1.txt, который вы дали, кажется, имеет некоторые специальные символы в начале файла.

.

Решение

public class Test {

    public static void main(String[] args) throws IOException {
        Test test = new Test();
        test.execute();
    }

    private static String TYPE_XTSM = "XTSM";
    private static String TYPE_XTS = "XTS";
    private static String TYPE_XRX = "XRX";
    private static String TYPE_XHAN = "XHAN";

    private void execute() throws IOException {
        InputStream in = null;
        BufferedReader br = null;
        TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
        try {
            in = Test.class.getResourceAsStream("test1.txt");
            br = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = br.readLine()) != null) {
                Record rec = new Record(line);
                processRecord(xtsmMap, rec);
            }
        } finally {
            if (br != null) {
                br.close();
            }
        }
        printResults(xtsmMap);
    }

    private void processRecord(
            TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap, Record rec) {
        TreeMap<Integer, Integer> xtsMap;
        if (xtsmMap.containsKey(rec.getXtsm())) {
            xtsMap = xtsmMap.get(rec.getXtsm());
        } else {
            xtsMap = new TreeMap<Integer, Integer>();
            xtsmMap.put(Integer.valueOf(rec.getXtsm()), xtsMap);
        }
        if (xtsMap.containsKey(rec.getXts())) {
            Integer count = xtsMap.get(rec.getXts());
            xtsMap.put(Integer.valueOf(rec.getXts()), Integer.valueOf(count
                    .intValue() + 1));
        } else {
            xtsMap.put(Integer.valueOf(rec.getXts()), Integer.valueOf(1));
        }
    }

    private void printResults(
            TreeMap<Integer, TreeMap<Integer, Integer>> xtsmMap) {
        System.out.println("Type\t\tTotal");
        Set<Integer> xtsmSet = xtsmMap.navigableKeySet();
        for (Integer xtsm : xtsmSet) {
            TreeMap<Integer, Integer> xtsMap = xtsmMap.get(xtsm);
            Set<Integer> xtsSet = xtsMap.navigableKeySet();
            for (Integer xts : xtsSet) {
                Integer count = xtsMap.get(xts);
                String outputLine = TYPE_XTSM + ":" + xtsm + "/" + TYPE_XTS
                        + ":" + xts + "\t" + count;
                System.out.println(outputLine);
            }
        }
    }

    private static class Record {

        private Integer xtsm, xts, xrk, xhan;

        Record(String line) {
            StringTokenizer st = new StringTokenizer(line, "/");
            while (st.hasMoreTokens()) {
                String token = st.nextToken();
                String type = token.substring(0, token.indexOf(":"));
                String valueStr = token.substring(token.indexOf(":") + 1, token
                        .length());
                Integer value = Integer.valueOf(valueStr);
                if (TYPE_XTSM.equals(type)) {
                    xtsm = value;
                } else if (TYPE_XTS.equals(type)) {
                    xts = value;
                } else if (TYPE_XRX.equals(type)) {
                    xrk = value;
                } else if (TYPE_XHAN.equals(type)) {
                    xhan = value;
                }
            }
        }

        public Integer getXtsm() {
            return xtsm;
        }

        public Integer getXts() {
            return xts;
        }

        public Integer getXrk() {
            return xrk;
        }

        public Integer getXhan() {
            return xhan;
        }
    }
}

.

выход

Type        Total
XTSM:0/XTS:0    29
XTSM:0/XTS:1    29
XTSM:0/XTS:2    29
XTSM:1/XTS:0    29
XTSM:1/XTS:1    29
XTSM:1/XTS:2    29
XTSM:2/XTS:0    29
XTSM:2/XTS:1    29
XTSM:2/XTS:2    29
XTSM:3/XTS:0    14
XTSM:3/XTS:1    14
XTSM:3/XTS:2    14
XTSM:4/XTS:0    13
XTSM:4/XTS:1    13
XTSM:4/XTS:2    13
XTSM:5/XTS:0    14
XTSM:5/XTS:1    14
XTSM:5/XTS:2    14
XTSM:6/XTS:0    21
XTSM:6/XTS:1    21
XTSM:6/XTS:2    21
XTSM:7/XTS:0    29
XTSM:7/XTS:1    29
XTSM:7/XTS:2    29
XTSM:8/XTS:0    14
XTSM:8/XTS:1    21
XTSM:9/XTS:0    21
XTSM:9/XTS:1    21
XTSM:9/XTS:2    21
XTSM:10/XTS:0   14
XTSM:10/XTS:1   14
XTSM:10/XTS:2   14
XTSM:11/XTS:0   14
XTSM:11/XTS:1   14
XTSM:11/XTS:2   14
XTSM:12/XTS:0   14
XTSM:12/XTS:1   14
XTSM:12/XTS:2   14
XTSM:13/XTS:0   29
XTSM:13/XTS:1   29
XTSM:13/XTS:2   29
XTSM:14/XTS:0   29
XTSM:14/XTS:1   29
XTSM:15/XTS:0   29
XTSM:15/XTS:1   29
XTSM:15/XTS:2   29
XTSM:16/XTS:0   29
XTSM:16/XTS:1   29
XTSM:16/XTS:2   29
XTSM:17/XTS:0   29
XTSM:17/XTS:1   29
XTSM:17/XTS:2   29
XTSM:18/XTS:0   29
XTSM:18/XTS:1   29
XTSM:18/XTS:2   29
XTSM:19/XTS:0   29
XTSM:19/XTS:1   29
XTSM:19/XTS:2   29
XTSM:21/XTS:0   29
XTSM:21/XTS:1   29
XTSM:21/XTS:2   29
XTSM:22/XTS:0   29
XTSM:22/XTS:1   29
XTSM:22/XTS:2   29
XTSM:23/XTS:0   29
XTSM:23/XTS:1   29
XTSM:23/XTS:2   29
XTSM:24/XTS:0   29
XTSM:24/XTS:1   29
XTSM:24/XTS:2   29
XTSM:25/XTS:0   29
XTSM:25/XTS:1   29
XTSM:25/XTS:2   29
XTSM:26/XTS:0   14
XTSM:26/XTS:1   14
XTSM:26/XTS:2   14
XTSM:28/XTS:0   15
XTSM:28/XTS:1   15
XTSM:28/XTS:2   15
XTSM:29/XTS:0   13
XTSM:29/XTS:1   13
XTSM:29/XTS:2   13
XTSM:30/XTS:0   14
XTSM:30/XTS:1   14
XTSM:31/XTS:0   14
XTSM:31/XTS:1   13
XTSM:31/XTS:2   13
XTSM:32/XTS:0   13
XTSM:32/XTS:1   14
XTSM:32/XTS:2   13
XTSM:33/XTS:0   14
XTSM:33/XTS:1   14
XTSM:33/XTS:2   14
XTSM:34/XTS:0   14
XTSM:34/XTS:1   14
XTSM:34/XTS:2   14
XTSM:35/XTS:0   29
XTSM:35/XTS:1   29
XTSM:35/XTS:2   29
XTSM:36/XTS:0   29
XTSM:36/XTS:1   21
XTSM:36/XTS:2   21
XTSM:37/XTS:0   14
XTSM:37/XTS:1   14
XTSM:37/XTS:2   14
XTSM:38/XTS:0   14
XTSM:38/XTS:1   14
XTSM:38/XTS:2   14
XTSM:39/XTS:0   21
XTSM:39/XTS:1   21
XTSM:39/XTS:2   21
XTSM:40/XTS:0   29
XTSM:40/XTS:1   29
XTSM:40/XTS:2   7
XTSM:41/XTS:0   29
XTSM:41/XTS:1   29
XTSM:41/XTS:2   29

2 голосов
/ 28 января 2010

Хорошо, я все еще пытаюсь понять проблему. Но я думаю, что при доступе к базе данных вы можете сохранить итоги для XTSM, XTS, XRX и XHAN.

Или просто рассчитать COUNT, где XTSM "?" (в подготовленном отчете). Я понимаю, что, может быть, это очень много для базы данных, которая уже довольно большая.

В любом случае, вы также можете сделать это в java, поскольку в последнем цикле for я == COUNT. Кстати, ваш псевдокод должен определять XTS в XTSM, потому что если он не пройдет через все XTS в базе данных, а не все XTS, связанные с вашим конкретным XTSM.

Больше идей, в ваших четырех форсах (я всегда хотел сказать это :)), вы могли бы добавить к счету какие-то ifs, чтобы вы знали, если вы зацикливаетесь на XTS, которая имеет логическое отношение с XTSM и снова в конце цикла я = COUNT.

Немного больше информации было бы замечательно, так как я думаю, что я не понимаю проблему подробно. Как вы получаете данные из базы данных? Есть ли у вас класс, который хранит это? Может быть, вы могли бы сделать несколько методов, чтобы вычислить это.

Я думаю, что простой класс

публичный класс Foo { int XTSM; int XTS; int XRX; INT XHAN; }

и последующее сохранение всех строк в списке (или в векторе, или на карте, что-то итеративное), считая элементы в списке, которые имеют XTSM = x и XTS = y Это сделает более или менее то, что вы пытаетесь сделать?

Редактировать: возможно, этот код помогает, не знаю, если это то, что вы ищете ... подумав, я думаю, что какой-то PL (если вы находитесь в ORACLE) сделает это быстрее. Во всяком случае, немного кода Jave ...

public class Foo {
int XTSM; 
int XTS; 
int XRX; 
int XHAN;
LinkedList lk;//maybe not a good idea to have it here
//but hey, it's a 30seconds thought...

public void getItAll() throws Exception{//mostly SQLException, but any you need
    Connection conn=null;
    //make the connection

    String query="SELECT XTSM, XTS, XRX, XHAN " +
            " FROM your_table" +
            " WHERE 1=1" +
            " AND 1=1";//add stuff you need to the query

    Statement stmt= conn.createStatement();
    ResultSet rst = stmt.executeQuery(query);
    Foo f = null;
    while(rst.next()){
        f = new Foo();
        //yeah, you should have getters and setters
        f.XTSM = rst.getInt("XSTM");
        f.XTS = rst.getInt("XST");
        f.XRX = rst.getInt("XRX");
        f.XHAN = rst.getInt("XHAN");
        this.lk.add(f);
        //this gives you all the table in a list (especifically a linkedlist
    }
}
public void calculateItAll() throws Exception{//some exception, probably IO?
    Foo f = null;
    int count =0;
    for(int i=0; i< this.lk.size(); i++){//we iterate through all the table
        f = new Foo();
        f = (Foo)this.lk.get(i);
        count = 0;
        for(int j=0; j<=200;j++){//XSTM
            if(f.XTSM == j){//I keep thinking that getters are good
                for(int k=0; k<=2;k++){//XST
                    if(f.XTS == k){//do the getters, really
                        for(int m=0;m<=3;m++){//XRX
                            if(f.XRX==m){//add funny comment about getters
                                for(int n=0;n<=7;n++){//XHAN
                                    if(f.XHAN==n){//man, so good that is almost finished
                                        count++;
                                    }//end of if
                                }//end of XHAN
                            }//end of if
                        }//end of XRX
                    }//end of if
                }//end ofXST
            }//end of if
        }//end of XSTM
        //here you write the count and all the Foo somewhere
    }
}}
1 голос
/ 28 января 2010

Не имеет смысла делать это в Java, поскольку то, что вы показываете, это просто обработка записей и минимальные манипуляции с текстом. Как отметил в своем комментарии Калеб Бразе, КОБОЛ может быть уместным. Но я не знаю КОБОЛ.

Вот быстрое решение Perl:

my $records = {};

for (<>) {
  next unless m{XTSM:(\d+)/XTS:(\d+)/XRX:(\d+)/XHAN:(\d+)};
  $$records{"XTSM:$1/XTS:$2"} ||= [];
  push @{$$records{"XTSM:$1/XTS:$2"}}, "$3/$4";
}

print "Type\t\t\tTotal\n";

for (sort keys %$records) {
  print "$_\t\t" . scalar @{$$records{$_}} . "\n";
} 

Пример вывода с предоставленным файлом:

Type                    Total
XTSM:0/XTS:0            29
XTSM:0/XTS:1            29
XTSM:0/XTS:2            29
XTSM:1/XTS:0            29
XTSM:1/XTS:1            29
XTSM:1/XTS:2            29
XTSM:10/XTS:0           14
XTSM:10/XTS:1           14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...