07. juni 2005 - 11:38Der 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.
/* * 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++; }
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);
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... :|
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
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.