Avatar billede rdc Nybegynder
13. juni 2006 - 23:54 Der er 11 kommentarer og
1 løsning

læse en tekstfil

Hejsa


Nogen der ved hvordan jeg i en tilfældig tekstfils indhold, læser sidste linie i tekstfilen?

har fx. strukturen:

Navn bla bla
tlf bla bla
hejsa hejse
tagmig


Så vil jeg så gerne læse tekstfilen men kun hive "tagmig" ud dette tilfælde og gemme det i en String...

på forhånd mange tak.
Avatar billede arne_v Ekspert
14. juni 2006 - 02:26 #1
Til inspiration:

package june;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class LastLine {
    public static String readLastLineSupButSlow(String fnm) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(fnm));
        String lastline = null;
        String line;
        while((line = br.readLine()) != null) {
            lastline = line;
        }
        br.close();
        return lastline;
    }
    public static String readLastLineUnSup(String fnm) throws IOException {
        RandomAccessFile raf = new RandomAccessFile(fnm, "r");
        String res = "";
        long ix = raf.length() - 1;
        for(;;) {
            raf.seek(ix);
            int c = raf.read();
            if(c == '\r' || c == '\n') break;
            res = (char)c + res;
            ix--;   
        }
        raf.close();
        return res;
    }
    public static void main(String[] args) throws Exception {
        System.out.println(readLastLineSupButSlow("C:\\z.txt"));
        System.out.println(readLastLineUnSup("C:\\z.txt"));
    }
}
Avatar billede rdc Nybegynder
14. juni 2006 - 09:28 #2
arne_v jeg tror det er nemmere for dig at hjælpe mig hvis du ser min kode:


          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, " ");

                    String lejlighedstekst = dele.nextToken();

                    int lejlighedsID = Integer.parseInt(lejlighedstekst.substring(0,1));
                                   
                    Lejlighed lejligheder = new Lejlighed(lejlighedsID);
                   
                    String lejlighedsSide = lejlighedstekst.substring(1,2);                 
                   
                    lejligheder.setSide(lejlighedsSide);
                    while (dele.hasMoreTokens()) {
                      String objekt = dele.nextToken();
                      double måleaflæsning = Double.parseDouble(dele.nextToken());

                      if (objekt.charAt(0)=='A') {
                        // Hvis det er et rum (radiator)
                      int rumID = Integer.parseInt(objekt.substring(1,2));
                        Rum rum = new Rum(måleaflæsning,rumID);
                        lejligheder.TilføjRum(rum);
                      } else if (objekt.charAt(0)=='G') {
                        // Hvis det er en garage
                          int garageID = Integer. parseInt(objekt.substring(1,2));
                        Garage garage = new Garage(måleaflæsning,garageID);
                        lejligheder.addGarage(garage);
                      }
                    }
                    bygning.Tilføj(lejligheder);

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


jeg tænkte på om jeg ikke bare kan nøjes med en if sætning inde i while løkken, som så undersøges sidste linie i filen test.txt, og derefter gemmer sidste linie i en "variabel/attribut"... håber du forstår mig
Avatar billede kalp Novice
14. juni 2006 - 09:57 #3
Hvis din kode virker burde dette vel give dig den sidste linje


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

while ( (linie = læser.readLine()) != null) {

tmp = linie;
           
}


StringTokenizer dele = new StringTokenizer(tmp, " ");

                    String lejlighedstekst = dele.nextToken();

                    int lejlighedsID = Integer.parseInt(lejlighedstekst.substring(0,1));
                                   
                    Lejlighed lejligheder = new Lejlighed(lejlighedsID);
                   
                    String lejlighedsSide = lejlighedstekst.substring(1,2);                 
                   
                    lejligheder.setSide(lejlighedsSide);
                    while (dele.hasMoreTokens()) {
                      String objekt = dele.nextToken();
                      double måleaflæsning = Double.parseDouble(dele.nextToken());

                      if (objekt.charAt(0)=='A') {
                        // Hvis det er et rum (radiator)
                      int rumID = Integer.parseInt(objekt.substring(1,2));
                        Rum rum = new Rum(måleaflæsning,rumID);
                        lejligheder.TilføjRum(rum);
                      } else if (objekt.charAt(0)=='G') {
                        // Hvis det er en garage
                          int garageID = Integer. parseInt(objekt.substring(1,2));
                        Garage garage = new Garage(måleaflæsning,garageID);
                        lejligheder.addGarage(garage);
                      }
                    }
                    bygning.Tilføj(lejligheder);

                  }
                  bygning.SorterLejligheder();
              System.out.println(bygning.toString());
             
          }
                     
                catch (NumberFormatException e) {
                    e.printStackTrace();
                }
                catch (FileNotFoundException e) {
                    System.out.println("Fejl filen blev ikke fundet");
                }
                catch (IOException e) {
                    System.out.println("Fejl");
                }
Avatar billede rdc Nybegynder
14. juni 2006 - 10:05 #4
nej desværre kalp.. det ændrer ikke noget..altså jeg får sidste linie udskrevet... men den udskrives som et lejlighedsID, altså kun som to tal... plus at den bliver sorteret, med alt andet der udskrives... hvilket jo giver forkert udskrift... jeg tænker nærmere på om jeg ikke kan lave en løkke efter her:

                          int garageID = Integer. parseInt(objekt.substring(1,2));
                        Garage garage = new Garage(måleaflæsning,garageID);
                        lejligheder.addGarage(garage);

som på en måde tjekker om sidste linie indeholder en double, og hvis sandt, så skal den gemme doublen i en double udgift... forstår du mig?
Avatar billede rdc Nybegynder
14. juni 2006 - 10:35 #5
nogen ideer?
Avatar billede kalp Novice
14. juni 2006 - 10:43 #6
Du kan evt. læse din tekst fil fra bunden først?
altså så den første linje du hiver ind er den sidste.
Du kan gøre det med denne kode

send bare teksten med i konstruktøren.. og benyt dig af metoden readline så modtager du den sidste linje!


package org.emerle.fileIO;
import java.io.*;
import java.util.*;

public class ReverseFileReader {   
        private String filename;   
        private RandomAccessFile randomfile;   
        private long position;
       
        public ReverseFileReader (String filename) throws Exception {       
            // Open up a random access file
            this.randomfile=new RandomAccessFile(filename,"r");
            // Set our seek position to the end of the file
            this.position=this.randomfile.length();
               
            // Seek to the end of the file
            this.randomfile.seek(this.position);
            //Move our pointer to the first valid position at the end of the file.
            String thisLine=this.randomfile.readLine();
            while(thisLine == null ) {
                this.position--;
                this.randomfile.seek(this.position);
                thisLine=this.randomfile.readLine();
                this.randomfile.seek(this.position);
            }
        }   
       
        // Read one line from the current position towards the beginning
        public String readLine() throws Exception {       
            int thisCode;
            char thisChar;
            String finalLine="";
           
            // If our position is less than zero already, we are at the beginning
            // with nothing to return.
            if ( this.position < 0 ) {
                    return null;
            }
           
            for(;;) {
                // we've reached the beginning of the file
                if ( this.position < 0 ) {
                    break;
                }
                // Seek to the current position
                this.randomfile.seek(this.position);
               
                // Read the data at this position
                thisCode=this.randomfile.readByte();
                thisChar=(char)thisCode;
               
                // If this is a line break or carrige return, stop looking
                if (thisCode == 13 || thisCode == 10 ) {
                    // See if the previous character is also a line break character.
                    // this accounts for crlf combinations
                    this.randomfile.seek(this.position-1);
                    int nextCode=this.randomfile.readByte();
                    if ( (thisCode == 10 && nextCode == 13) || (thisCode == 13 && nextCode == 10) ) {
                        // If we found another linebreak character, ignore it
                        this.position=this.position-1;
                    }
                    // Move the pointer for the next readline
                    this.position--;
                    break;
                } else {
                    // This is a valid character append to the string
                    finalLine=thisChar + finalLine;
                }
                // Move to the next char
                this.position--;
            }
            // return the line
            return finalLine;
        }   
}
Avatar billede rdc Nybegynder
14. juni 2006 - 10:52 #7
kalp... jeg sad også og tænkte på det gøre det på den måde... men altså det må kunne gøre simplere... for alt den kode du lige forslog er simpelthen for meget, og hvis jeg benytter det, så bliver det alt for uoverskueligt i min egen kode... jeg er sikker på at der er nogen simplere... ved du om man kan lave om på funktion StringTokenizer, sådan at den stopper med at dele værdierne ud til forskellege variabler/attributter, lige inden sidste linie? For mit problem i øjeblikket er netop at den jo også indlæser sidste linie og indeler den til lejlighedsværdi, da værdi på sidste linie er et tal.
Avatar billede kalp Novice
14. juni 2006 - 11:25 #8
Alt den kode jeg lige viste dig skal du gemme i sin egen klasse;)
og oprette en instans af den som med StringTokenizer

men jeg tænker lige:) er på arbejde så det er kun derfor jeg er lidt ukoncentreret:)
Avatar billede rdc Nybegynder
14. juni 2006 - 12:12 #9
ok tusind tak for din indsats.. jeg prøver også selv imens :)
Avatar billede rdc Nybegynder
14. juni 2006 - 15:28 #10
hej igen... jeg har fundet ud af det... og det lykkes for mig nu at få vist det jeg vil have :) tusind tak for jeres forsøg på hjælp... lav et svar begge to så i kan få tildelt point begge to.
Avatar billede kalp Novice
15. juni 2006 - 08:45 #11
jeg behøver ikke point:)
godt det blev løst:)
Avatar billede arne_v Ekspert
16. juni 2006 - 02:11 #12
svar
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