Avatar billede rdc Nybegynder
11. juni 2006 - 12:20 Der er 21 kommentarer og
1 løsning

Læse indhold af tekstfil

Hejsa,

jeg er igang med et eksamensprojekt og har desværre lige pt ikke mulighed for spørge nogen til råds... jeg har fået lavet en udgave som virker og den ser således ud:

        try {
            BufferedReader læser = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
            String linie;

                while ( (linie = læser.readLine()) != null) {
                    StringTokenizer dele = new StringTokenizer(linie, " ");
                    // while ( (dele.nextToken()) > null) {
                       
                    String lejlighedsid = dele.nextToken();
                    String radiatorid = dele.nextToken();

                    double kvameter = Double.parseDouble(dele.nextToken());
                    String radiatorid2 = dele.nextToken();

                    double kvameter2 = Double.parseDouble(dele.nextToken());
                    System.out.println( lejlighedsid + " " + radiatorid + " " + kvameter + " " + radiatorid2 + " " + kvameter2);
                    }
                //}

        }
            catch (NumberFormatException e) {
                e.printStackTrace();
            }
            catch (FileNotFoundException e) {
                System.out.println("Fejl filen blev ikke fundet");
            }
            catch (IOException e) {
                System.out.println("Fejl");
            }
        }


men problemet er så bare at hvis der i tekstfilen står:
1H A1 35.0 A2 10.0 G1 14.0
1V A3 35.0 A4 10.0 G7 15.0
2V A5 35.0 A6 10.0 A7 20.0


så læser den kun frem til det her:
1H A1 35.0 A2 10.0
1V A3 35.0 A4 10.0
2V A5 35.0 A6 10.0

okay det er nemt nok at udvide koden til lige at læse det to sidste værdier på linierne...

men jeg vil gerne have at koden tjekker hvert linie fuldt ud til sidste værdi på linien og så evt tildeler det ud i hvert attribut... for da brugeren af programmet i sidste ende har mulighed for at indtaste så mange værdier som han har lyst til, så kan i godt se at min kode ikke er fyldestgørende...

på forhånd mange tak for hjælpen.
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 12:29 #1
Din while-løkke kan simplificeres en del - og gøres mere dynamisk:

while ( (linie = læser.readLine()) != null)
{
    String[] elements = linie.split(" ");
    for (int i = 0; i < elements.length; i++)
        System.out.print (elements[i] + " ");
    System.out.println();
}
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 12:30 #2
Med hensyn til at dele det ud i hver sin variabel, bliver det vanskeligt hvis ikke du kender strukturen af din fil.
Avatar billede rdc Nybegynder
11. juni 2006 - 12:32 #3
jo men det skriver der... så ved computeren jo ikke hvad der er hvad... det er jo næsten ligesom som bare at lade den læse hele linien ud...

men ellers effektivt :)
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 12:35 #4
"jo men det skriver der... så ved computeren jo ikke hvad der er hvad... det er jo næsten ligesom som bare at lade den læse hele linien ud..."

Jeg forstår ikke helt hvad du skriver/mener der? :)
Avatar billede rdc Nybegynder
11. juni 2006 - 12:41 #5
hehe.. ok :) det jeg mener er, at i min kode så kan jeg hive de forskelligeværdi ud og plotte dem ind andre steder, fordi de ligger i forskellige "variabler", men i din kode der plottes alt jo bare ind
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 12:47 #6
Ja, okay. Men som sagt så bliver det ekstremt vanskeligt at lave, hvis ikke der er en form for struktur / begrænsing i din fil.

Jeg forestiller mig, at du har et objekt, der skal indeholde alle disse værdier. Og hvis det skal være til at finde ud af, bliver du nødt til at kunne læse de enkelte properties ud for hver linje i filen og plugge dem ind i dit objekt.


Når du skriver:
"har mulighed for at indtaste så mange værdier som han har lyst til"

Hvad ligger der så i det? Er det brugeren der bestemmer hvor mange værdier han vil skrive eller er dig der fastsætter et antal værdier, som brugeren så frit kan vælge imellem?
Avatar billede rdc Nybegynder
11. juni 2006 - 13:05 #7
det er brugeren det manuelt senere hen i programmet der selv indtaster de værdier han vil have... hvis han fx vil have 5 mio lejligheder så skriver han det, osv...
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 13:11 #8
Ja, men du skriver vel én lejlighed pr linje, right?

Det er ikke antallet af rækker jeg snakker om, men antallet af kolonner/værdier i hver række. Er det dynamisk eller fastsat?
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 13:12 #9
For antallet af kolonner kommer til at afspejle de værdier dit lejligheds-objekt kommer til at indeholde.
Avatar billede rdc Nybegynder
11. juni 2006 - 13:20 #10
ja en lejlighed pr linje og antallet af kolonner/værdier er dynamiske
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 13:26 #11
Så bliver det vanskeligt!

Jeg kan ikke se hvordan du skal kunne lave det, uden at have en form for struktur.

Er der ikke nogle værdier der altid går igen for en lejlighed? Disse værdier kan du sætte som variabler i dit objekt, hvorimod alle de dynamiske felter bliver du nødt til at oprette som én type - f.eks. Strings og gemme dem i et array.
Avatar billede rdc Nybegynder
11. juni 2006 - 13:39 #12
jo altså rum numrene er jo faste... de er altså A1,A2, A3 osv...
det samme med garagerne som er: G1,G2,G3 osv... lejlighederne er også faste men det kan godt variere fra fx 1V, 1H, 2V,2H osv...
Avatar billede rdc Nybegynder
11. juni 2006 - 14:25 #13
forstår du mig mikkelbm?
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 14:35 #14
Så er jeg her lidt igen. Vejret er jo godt idag :)

Jeg ved ikke helt om jeg forstår dig. Det er stadig lidt abstrakt for mig.

Og jeg ved heller ikke hvilket niveau du er på. Hvor meget har du arbejdet med objekter?

For hvis jeg skulle lave det, så ville det blive noget a la:

public class Appartment
{
    private int id;
    private int size;
    private Room[] rooms;
    private Garage garage;
   
    public Appartment()
    {}
   
    // Get og set metoder....
}

public class Room
{
    private int size;
   
    public Room()
    {}
   
    // get og set metoder
}

public class Garage
{
    private int number;
   
    public Garage()
    {}
   
    // Get og set metoder.
}


Men ovenstående bliver meget svært at gemme i den filstruktur du har. Du har ikke overvejet at gemme i en database i stedet?
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 14:37 #15
Hvis du kan gemme i en database kunne strukturen se sådan her ud:

TBLAppartment
- id
- size

TBLRoom
- appartmentid
- size

TBLGarage
- id

TBLGarageAppRelation // Dette er en relationstabel, så en garage ikke nødvendigvis er bundet op på en lejlighed.
- appartmentid
- garageid
Avatar billede rdc Nybegynder
11. juni 2006 - 15:04 #16
mikkel har du msn, så kan jeg forklare det til dig over msn, og så kan jeg evt også sende mine filer til dig.. så kan du se hvad jeg mener... :)
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 15:14 #17
Jeg har ikke mere tid idag. Men du må gerne sende mig dine filer + opgavebeskrivelse på min bluetone mail, som står under min brugerside.
Avatar billede mikkelbm Nybegynder
11. juni 2006 - 15:15 #18
Så kigger jeg muligvis på det i aften - ellers bliver det først en gang imorgen.
Avatar billede esbenp Nybegynder
12. juni 2006 - 12:30 #19
Nu kender jeg ikke så meget til opgaven, men måske burde du overveje at bruge Serializable som er en hurtig måde at gemme et objekt hierarki på disken. Kig på klasserne ObjectStreamWriter/ObjectStreamReader
Avatar billede rdc Nybegynder
12. juni 2006 - 13:06 #20
hey mikkelbm du behøver ikke at hjælpe mig længere... jeg har fundet ud af det... læg et svar, så du kan få pointsene... tusind tak for hjælpen ellers.
Avatar billede mikkelbm Nybegynder
12. juni 2006 - 18:14 #21
Super.

Hvordan løste du så problemet?
Avatar billede rdc Nybegynder
12. juni 2006 - 19:54 #22
jeg lavede en to løkker der tjekkede for bogstavet i værdierne, og hvis det så var A, så smed jeg indholdet i et array og hvis det var noget andet så smed jeg det et andet sted...
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