Avatar billede schris Praktikant
07. august 2009 - 08:27 Der er 3 kommentarer og
1 løsning

Fil parser

Hej!
Jeg er en absolut newbie inden for JAVA, og mit niveau er ca 2 mm over gulvhøjde. Jeg har brug for at lave et lille program, der kan parse nogle data ud af en fil.

Rent praktisk skal den lede efter en sekvens af  HEX værdier - ex PP QQ WW XX YY ZZ. Når sekvensen forekommer skal dataene i WW byten læses og fortolkes som længden på den tekststreng der skal læses ud begyndende med XX byten. Efterfølgende skal der videre søges efter en tilhørende sekvens af HEX værdier LL MM NN OO PP, hvorefter de efterfølgende 32 bytes data skal udlæses. Rutinen skal gentages indtil EOF. Disse datapar skal udlæses til en CSV fil

Som sagt er jeg ikke meget bevendt som programmør endnu - men håber at blive det :-)

ER der nogen bud på hvorledes jeg griber dette "kæmpe projekt" an?

mvh

schris
Avatar billede arne_v Ekspert
07. august 2009 - 15:46 #1
2 mm er ikke ret meget !

:-)

Jeg ved ikke om du finder dette eksempel illustrativt:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

public class SpecialParser {
    private static String CHARSET = "ISO-8859-1";
    private static String Q = "";
    private static String SEP = ",";
    private static interface DataParse {
        public String parse(InputStream is) throws IOException;
    }
    private static class CountedDataParse implements DataParse {
        public String parse(InputStream is) throws IOException {
            int len = is.read();
            byte[] b = new byte[len];
            is.read(b);
            return new String(b, CHARSET);
        }
    }
    private static class FixedDataParse implements DataParse {
        private int len;
        public FixedDataParse(int len) {
            this.len = len;
        }
        public String parse(InputStream is) throws IOException {
            byte[] b = new byte[len];
            is.read(b);
            return new String(b, CHARSET);
        }
    }
    private static final byte[][] marker = { { 0x07, 0x07 }, { 0x08, 0x09, 0x0A, 0x0B, 0x0C } };
    private static final DataParse[] handler = { new CountedDataParse(), new FixedDataParse(3) };
    public void parse(InputStream is, PrintStream ps) throws IOException {
        String[] res = new String[marker.length];
        int state = 0;
        int len = 0;
        int c;
        while((c = is.read()) >= 0) {
            if(c == marker[state][len]) {
                len++;
            } else {
                len = 0;
            }
            if(len == marker[state].length) {
                res[state] = handler[state].parse(is);
                state++;
                len = 0;
                if(state == marker.length) {
                    ps.print(Q + res[0] + Q);
                    for(int i = 1; i < res.length; i++) {
                        ps.print(SEP + Q + res[i] + Q);
                    }
                    ps.println();
                    state = 0;
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        // format:
        //  ....
        //  marker #1 = 0x07 0x07
        //  1 byte length
        //  N bytes of data in ISO-8859-1
        //  ...
        //  marker #2 = 0x08 0x09 0x0A 0x0B 0x0C
        //  3 bytes of data in ISO-8859-1
        //  ...
        byte[] b = { 0, 7, 7, 2, 65, 66, 0, 0, 8, 9, 10, 11, 12, 65, 66, 67, 0, 0, 0, 7, 7, 2, 66, 67, 0, 0, 8, 9, 10, 11, 12, 66, 67, 68, 0 };
        SpecialParser p = new SpecialParser();
        p.parse(new ByteArrayInputStream(b), System.out);
    }
}
Avatar billede arne_v Ekspert
13. september 2009 - 03:35 #2
OK ?
Avatar billede schris Praktikant
13. september 2009 - 08:37 #3
Sorry jeg ikke har svaret før :-)

Helt OK

Takker
Avatar billede schris Praktikant
13. september 2009 - 08:38 #4
Soem nedenunder - helt oik :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester