webForumDet fria alternativet

Hämta ifrån en textfil

4 svar · 917 visningar · startad av Asa

AsaMedlem sedan dec. 20011 860 inlägg
#1

Hur hämtar jag text ifrån en textfil?

Textfilen data.txt ser ut så här:

rad 1 = Titel 1 ; Infotext 1 ; Datum 1 ; Pris 1 ; Bild 1
rad 2 = Titel 2 ; Infotext 2 ; Datum 2 ; Pris 2 ; Bild 2
rad 3 = Titel 3 ; Infotext 3 ; Datum 3 ; Pris 3 ; Bild 3
rad 4 = Titel 4 ; Infotext 4 ; Datum 4 ; Pris 4 ; Bild 4
rad 5 = Titel 5 ; Infotext 5 ; Datum 5 ; Pris 5 ; Bild 5

Jag vill hämta ut ex rad 1 och spara alla olika värderna i olika variabler som sedan ska kunna användas för att skrivas ut i olika textfält. Hur gör jag?

LimeMedlem sedan sep. 2001961 inlägg
#2

Scanner

Enklast är att använda sig av Scanner-klassen.

Jag gjorde ett litet hack, har kommenterat i koden vad jag gör.

package filereader;

import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
import java.util.Vector;

public class LineReader {

	private Vector<Row> rows = new Vector<Row>();

	/**
	 * Läser in filen "theFile.txt" som ser ut såhär:
	 rad 1 = Titel 1 ; Infotext 1 ; 2007-01-01 ; 100,11 ; http://www.images.se/Bild1.gif
	rad 2 = Titel 2 ; Infotext 2 ; 2008-02-02 ; 200,22 ; http://www.images.se/Bild2.gif
	rad 3 = Titel 3 ; Infotext 3 ; 2009-03-03 ; 300,33 ; http://www.images.se/Bild3.gif
	rad 4 = Titel 4 ; Infotext 4 ; 2010-04-04 ; 400,44 ; http://www.images.se/Bild4.gif
	rad 5 = Titel 5 ; Infotext 5 ; 2011-05-05 ; 500,55 ; http://www.images.se/Bild5.gif
	 */
	public void readFile() {
		// Letar upp filen.
		URL theFileURL = ClassLoader.getSystemResource("theFile.txt");
		try {
			// Startar en ny scanner som läser använder sig av filen.
			Scanner fileScanner = new Scanner(theFileURL.openStream());
			// Jag vill splitta på ;= och nyrad
			fileScanner.useDelimiter("\\s*[;=\\r]\\s*");
			// Så länge det finns fler element så ska vi fortsätta.
			while (fileScanner.hasNext()) {
				// Först på raden ska det komma en text "rad" så jag använder ett regexp.
				String rad = fileScanner.next("rad.*");
				// Sedan kommer titeln, en vanlig sträng.
				String titel = fileScanner.next();
				// Sedan vill jag ha infotexten, också det en sträng.
				String info = fileScanner.next();
				// Och så ett datum (här skulle man kunna kolla med ett regexp).
				String date = fileScanner.next();
				// Och sedan en summa, som ska vara ett flyttal.
				float price = fileScanner.nextFloat();
				// och sist urlen till bilden
				String image = fileScanner.next();
				// Och så lägger jag till en ny rad i min samling av rader.
				rows.add(new Row(rad, titel, info, date, price, image));

			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Skriver ut alla rader.
	 */
	public void printRows() {
		for (Row row : rows) {
			System.out.println(row);
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LineReader lr = new LineReader();

		lr.readFile();
		lr.printRows();

	}

	// En privat klass för att hålla i informationen om varje rad.
	private class Row {

		private String rad;
		private String titel;
		private String info;
		private String date;
		private float price;
		private String image;

		public Row(String rad, String titel, String info, String date,
				float price, String image) {

			this.rad = rad;
			this.titel = titel;
			this.info = info;
			this.date = date;
			this.price = price;
			this.image = image;

		}

		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append(rad);
			sb.append(";");
			sb.append(titel);
			sb.append(";");
			sb.append(info);
			sb.append(";");
			sb.append(date);
			sb.append(";");
			sb.append(price);
			sb.append(";");
			sb.append(image);
			return sb.toString();
		}
	}

}

Hoppas det ger dig lite ledtråd hur du ska göra...

AsaMedlem sedan dec. 20011 860 inlägg
#3

Tackar för koden :)
Men jag mena att filen ser ut så här:

Titel 1 ; Infotext 1 ; Datum 1 ; Pris 1 ; Bild 1
Titel 2 ; Infotext 2 ; Datum 2 ; Pris 2 ; Bild 2
Titel 3 ; Infotext 3 ; Datum 3 ; Pris 3 ; Bild 3
Titel 4 ; Infotext 4 ; Datum 4 ; Pris 4 ; Bild 4
Titel 5 ; Infotext 5 ; Datum 5 ; Pris 5 ; Bild 5

Dock felmesset:

Exception in thread "main" java.lang.NullPointerException
        at App.LineReader.readFile(LineReader.java:34)
        at App.LineReader.main(LineReader.java:78)
Java Result: 1

Denna:
Scanner fileScanner = new Scanner(theFileURL.openStream());

LimeMedlem sedan sep. 2001961 inlägg
#4

Ah, filen ligger någonstans i class-pathen och heter "theFile.txt" och ser ut som det som jag kommenterade.

AsaMedlem sedan dec. 20011 860 inlägg
#5

Så här enkelt blev det ju:

    public DBFilmer() {
        lista = new ArrayList<Film>();
        try{
            BufferedReader filen = new BufferedReader(new FileReader("txt/Filmer.txt"));
            String raden = filen.readLine();//throws IOException
            
            while(raden !=null){
                    StringTokenizer tk=null;
                    tk=new StringTokenizer(raden,";");                        
                    lista.add(new Film(tk.nextToken(),tk.nextToken(),tk.nextToken(),tk.nextToken(),tk.nextToken(),tk.nextToken()));
                    raden=filen.readLine();//läser in nästa rad från filen               
            } 
            filen.close( );//throws IOException
        }
        catch(FileNotFoundException e){
                System.out.println("Filmer.txt was not found");
                System.out.println("or could not be opened.");
        } 
        catch(IOException e){
                System.out.println("Could not read from Filmer.txt");
        }
    }
136 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)