Avatar billede zitzo Nybegynder
07. juni 2005 - 11:38 Der er 13 kommentarer og
1 løsning

Overførsel af information fra text fil til array

Jeg skal lave en metode der kan overfører informationer fra en text fil til en række arrays. Men jeg har aldrig været helt skarp til det med patterns og sådan så jeg tænkte der msåke var en der lige kunne give mig et fingerpej i den rigtige retning.

Filen er sat op således:
layer
  {
  name:        1_p5
  class:    Topside
  material:    0.018-Cobber
  thickness:    -0.018
  data:        J:\Job\26000-26999\26700-26799\26705\art01.pho
  plot
    {
    polarity:    POSITIVE
    emulsion:    DOWN
    resolution:    4000
    uscale:    10000000
    xscale:    10000500
    yscale:    10000500
    sxcenter:    230
    sycenter:    304.9999
    mirror:    X
    rotation:    N
    film:    20x26
    }
  }
layer
  {
  name:        2_p5
  class:    IT_Topside
  material:    Cobber
  zpos:        0.144
  thickness:    -0.035
  data:        J:\Job\26000-26999\26700-26799\26705\art02.pho
  plot
    {
    polarity:    NEGATIVE
    emulsion:    DOWN
    resolution:    4000
    uscale:    10000000
    xscale:    10000000
    yscale:    10001500
    sxcenter:    230
    sycenter:    304.9999
    mirror:    X
    rotation:    N
    film:    20x26
    }
  }

Her ses en stykke at filen som beskriver nogen layers, resten af filen vil jeg mene er irrelavant da det bygget op ligeså, det hedder bare nogen andre ting.

Jeg havde tænkt mig at bygge arrayet med layers således:
layer[x][0] skal indeholde name
layer[x][1] skal indeholde class
osv.

Jeg har lagt filen fra en FileReader over i en String.
Jeg har lavet et array med navnene på de forskellige punkter i et layer:
layerIdent[0] = "name"
layerIdent[1] = "class"
osv.

Men det er lige det der med at få det splittet op, jeg må indrømme jeg er på herrens mark.
Avatar billede simonvalter Praktikant
07. juni 2005 - 16:26 #1
Måske noget ala dette .. der er mange måder ..

    public static void main(String[] args) {
        Scanner sc = null;
        try {
            sc = new Scanner(new FileInputStream("text.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        /*
        * Regular expressions der bruger capturing groups
        * (string:\\s+) er string og whitespace(1 eller flere gange) i capture group 1
        * S+ er hvilken som heltst non-whitespace character(1 eller flere gange) i capture group 2
        */
        String namePattern = "(?=(name:\\s+)(\\S+))";
        String classPattern = "(?=(class:\\s+)(\\S+))";
        String materialPattern = "(?=(material:\\s+)(\\S+))";
        String thicknessPattern = "(?=(thickness:\\s+)(\\S+))";
        String dataPattern = "(?=(data:\\s+)(\\S+))";

      int layer = 0;
        while (sc.hasNext()) {
            String next = sc.findInLine("layer");
            if (next != null) {
              layer++;
            }

            String nameValue = sc.findInLine(namePattern);
            print(nameValue, sc);

            String classValue = sc.findInLine(classPattern);
            print(classValue, sc);

            String materialValue = sc.findInLine(materialPattern);
            print(materialValue, sc);

            String thicknessValue = sc.findInLine(thicknessPattern);
            print(thicknessValue, sc);

            String dataValue = sc.findInLine(dataPattern);
            print(dataValue, sc);

            sc.nextLine();  // Read the next line
        }

    }

    public static void print(String value, Scanner sc) {
        if (value != null) {
            MatchResult result = sc.match();
            System.out.println(result.group(2));
        }
    }
Avatar billede simonvalter Praktikant
07. juni 2005 - 17:31 #2
ups skal vist være
while (sc.hasNextLine()) {
Avatar billede zitzo Nybegynder
08. juni 2005 - 08:24 #3
Nu har jeg ikke testet det, men det ser meget overbevisende ud. Jeg takker mange gange og går igang med at teate det med det samme :)
Avatar billede zitzo Nybegynder
08. juni 2005 - 10:35 #4
Nu har jeg siddet og rodet lidt med det og kan ikke få den til at ligge en værdi i group 2. Der er et sted i bunden af filen der står hvor mange lag der, den infor ksla jeg bruge til at lave størrelsen på arrayet. Nedenfor står koden til pattern og så videre, parsedFile kommer fra en JFileChooser og den ser ud til at loade filen som den skal.

sc = new Scanner(parsedFile);
String layersPattern = "(?=(\\s+Layers:)(.+))";

while(tempValue == null){ //Finder antal af lag
    tempValue = sc.findInLine(layersPattern);
    sc.nextLine();
}
returnResult(tempValue,sc);

public void returnResult(String value, Scanner sc){
    if(value != null){
        MatchResult result = sc.match();
        System.out.println(result.groupCount());
        //System.out.println(result.group(2));
        //return(result.group(2));
    }else{
        System.out.println("Value = null");
    }
}

Den bliver ved at med at fortælle at der kun er et group punkt, som er tom og jeg udskriver value i i returnResults er den lig "".
Avatar billede zitzo Nybegynder
08. juni 2005 - 10:37 #5
i filen står der:
"  Layers:6"
Avatar billede zitzo Nybegynder
08. juni 2005 - 11:12 #6
btw har jeg prøvet alverdens patterns til group 2 i pattern
(\\S+) og (\\d+) osv...
Avatar billede zitzo Nybegynder
08. juni 2005 - 11:46 #7
Det giver sq ingen mening, har siddet og surfet godt rundt på det og det burde sq virke... den kan godt finde linien med informationen i for når jeg sætter den til at printe sc.group(0) ud skriver den "Layers:6" hvilket jo er fuldstændigt korrekt... :|
Avatar billede zitzo Nybegynder
08. juni 2005 - 12:13 #8
så nu vil jeg sq holde en pause med det der... det går mig godt nok til hovedet :)
Jeg har fårsøt at få så mange informationer ud af result om muligt, men jeg har lidt svært ved at finde ud af hvad der er rigtigt og forkert når det går videre fra groups.

Koden ser således ud til udprintning af result info:
public void returnResult(String value, Scanner sc){
if(value != null){
    MatchResult result = sc.match();
    System.out.println("GroupCount: "+result.groupCount());
    System.out.println("Result: "+result.group(0));
    System.out.println("Result: "+result.group(1));
    System.out.println("Start: "+result.start());
    System.out.println("End: "+result.end());
    System.out.println("String: "+result.toString());
    //return(result.group(2));
}else{
    System.out.println("Value = null");
}
}

Det ender ud i dette:
GroupCount: 1
Result: Layers:6

Result:

Start: 650
End: 660
String: java.util.regex.Matcher[pattern=.*(
|[

???])|.+$ region=0,1024 lastmatch=Layers:6
]
Avatar billede simonvalter Praktikant
08. juni 2005 - 12:24 #9
String layersPattern = "(?=(Layers:)(\\d+))";
Avatar billede zitzo Nybegynder
08. juni 2005 - 12:58 #10
Ja det skulle man mene ikke... men jeg får stadig ikke noget i group 1 og group 2 findes slet ikke!?
Avatar billede simonvalter Praktikant
08. juni 2005 - 13:12 #11
Det virker her
  public static void main(String[] args) {
        Scanner sc = null;
        try {
            sc = new Scanner(new FileInputStream("text.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String layersPattern = "(?=(Layers:)(\\d+))";
        while (sc.hasNextLine()) {
            String layersValue = sc.findInLine(layersPattern);

                getProperty(layersValue, sc);
         
            sc.nextLine();
        }
        sc.close();
    }


    public static void getProperty(String value, Scanner sc) {
        MatchResult result = null;
        if (value != null) {
            result = sc.match();
            System.out.println(result.group(2));
        }
    }
Avatar billede zitzo Nybegynder
08. juni 2005 - 13:21 #12
ja det gør det... underligt det andet ikke virker... nå der må jeg være en fejl 40 et eller andet sted.
Avatar billede zitzo Nybegynder
08. juni 2005 - 13:27 #13
ok man skal simpelhen kalde "getProperty" lige efter finfInLine... den havde jeg ikke lige afprøvet... der er hul igennem nu. Jeg takker mange gange.

Smider du lige et svar :)
Avatar billede simonvalter Praktikant
08. juni 2005 - 13:30 #14
ok =)
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
Kategori
Kurser inden for grundlæggende programmering

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