AsaMedlem sedan dec. 20011 860 inlägg 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 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 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 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 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");
}
}