Aus CSV datei lesen

Zacherias

Mitglied
Hallo,
Ich habe da ein kleines problem und zwar habe ich eine Oberfläche programmiert in der man daten wie Name, Vorname usw eingegebn kann. Die Daten werden dann in einer csv datei abgespeichert. Die daten will ich dann wieder anzeigen lassen und wenn es mehrere sind auch zwischen denen durchblättern. Für das durcblätter habe ich schon buttons erstellt sind aber noch ohne funktion.Probiere zwar noch einiges aus wäre aber net wenn mir jemand helfen kann .
Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.regex.*;



public class EingabeFI2 extends Frame {
  // Anfang Variablen
  private Label lblTitel = new Label();
  private Label lblName = new Label();
  private TextField txtName = new TextField();
  private Label lblVorname = new Label();
  private TextField txtVorname = new TextField();
  private Label lblStrasse = new Label();
  private TextField txtStrasse = new TextField();
  private Label lblOrt = new Label();
  private TextField txtPlz = new TextField();
  private TextField txtOrt = new TextField();
  private CheckboxGroup geschlecht = new CheckboxGroup();
  private Checkbox rbM = new Checkbox("männlich", geschlecht, true);
  private Checkbox rbW = new Checkbox("weiblich", geschlecht, false);
  private Label lblKenntnisse = new Label();
  private Checkbox ckProg = new Checkbox();
  private Checkbox ckBetr = new Checkbox();
  private Checkbox ckNet = new Checkbox();
  private Label lblWeitere = new Label();
  private TextArea textArea = new TextArea("", 1, 1,
                                           TextArea.SCROLLBARS_VERTICAL_ONLY);
  private Button btnUebernehmen = new Button();
  private Button btnLoeschen = new Button();
  private Speichern save = new Speichern();
  private DlgNochmal dlg = new DlgNochmal(this, "nochmal?", true);
  private Button btnLetzter= new Button();
  private Button btnVorwaerts = new Button();
  private Button btnZurueck = new Button();
  private Button btnErster = new Button();

  // Ende Variablen
  public EingabeFI2(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent evt) {
          System.exit(0);
        }
      });

    int frameWidth = 557;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);

    Panel cp = new Panel(null);
    add(cp);
    cp.setBackground(Color.YELLOW);
    // Anfang Komponenten
    lblTitel.setBounds(16, 8, 400, 20);
    lblTitel.setText("Eingabeformular");
    lblTitel.setFont(new Font("MS Sans Serif", Font.BOLD, 15));
    cp.add(lblTitel);
    lblName.setBounds(16, 40, 37, 16);
    lblName.setText("Name");
    lblName.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblName);
    txtName.setBounds(80, 40, 193, 24);
    txtName.setText("");
    cp.add(txtName);
    lblVorname.setBounds(16, 72, 55, 16);
    lblVorname.setText("Vorname");
    lblVorname.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblVorname);
    txtVorname.setBounds(80, 72, 193, 24);
    txtVorname.setText("");
    cp.add(txtVorname);
    lblStrasse.setBounds(16, 104, 46, 16);
    lblStrasse.setText("Strasse");
    lblStrasse.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblStrasse);
    txtStrasse.setBounds(80, 104, 193, 24);
    txtStrasse.setText("");
    cp.add(txtStrasse);
    lblOrt.setBounds(16, 136, 45, 16);
    lblOrt.setText("PLZ/Ort");
    lblOrt.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblOrt);
    txtPlz.setBounds(80, 136, 57, 24);
    txtPlz.setText("");
    cp.add(txtPlz);
    txtOrt.setBounds(144, 136, 129, 24);
    txtOrt.setText("");
    cp.add(txtOrt);
			    rbM.setBounds(80, 176, 89, 25);
			    cp.add(rbM);
			    rbW.setBounds(176, 176, 97, 25);
			    cp.add(rbW);
    lblKenntnisse.setBounds(288, 40, 104, 16);
    lblKenntnisse.setText("Kenntnisse:");
    lblKenntnisse.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(lblKenntnisse);
    ckProg.setBounds(288, 72, 121, 25);
    ckProg.setLabel("Programmieren");
    cp.add(ckProg);
    ckBetr.setBounds(288, 104, 121, 25);
    ckBetr.setLabel("Betriebssysteme");
    cp.add(ckBetr);
    ckNet.setBounds(288, 136, 129, 25);
    ckNet.setLabel("Netzwerke");
    cp.add(ckNet);
    lblWeitere.setBounds(288, 168, 46, 16);
    lblWeitere.setText("weitere:");
    lblWeitere.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblWeitere);
    textArea.setBounds(288, 192, 241, 65);
    textArea.setText("\n");
    cp.add(textArea);
    btnUebernehmen.setBounds(24, 232, 121, 25);
    btnUebernehmen.setLabel("Übernehmen");
    btnUebernehmen.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          btnUebernehmen_ActionPerformed(evt);
        }
      });
    cp.add(btnUebernehmen);
    btnLoeschen.setBounds(160, 232, 113, 25);
    btnLoeschen.setLabel("Löschen");
    btnLoeschen.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
          btnLoeschen_ActionPerformed(evt);
        }
      });
    cp.add(btnLoeschen);
    btnErster.setBounds(24, 200, 27, 25);
    btnErster.setLabel("<");
    btnErster.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnErster_ActionPerformed(evt);
      }
    });
    cp.add(btnErster);
    btnLetzter.setBounds(152, 200, 27, 25);
    btnLetzter.setLabel(">");
    btnLetzter.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnLetzter_ActionPerformed(evt);
      }
    });
    cp.add(btnLetzter);
    btnZurueck.setBounds(64, 200, 27, 25);
    btnZurueck.setLabel("<<");
    btnZurueck.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnZurueck_ActionPerformed(evt);
      }
    });
    cp.add(btnZurueck);
    btnVorwaerts.setBounds(112, 200, 27, 25);
    btnVorwaerts.setLabel(">>");
    btnVorwaerts.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnVorwaerts_ActionPerformed(evt);
      }
    });
    cp.add(btnVorwaerts);
    // Ende Komponenten
    setResizable(false);
    setVisible(true);
  }

  // Daten:
  String name = this.txtName.getText();
  String vorname = this.txtVorname.getText();
  String plz = this.txtPlz.getText();
  String ort = this.txtOrt.getText();
  String strasse = this.txtStrasse.getText();
  String geschl = "";
  String prog = "";
  String betr = "";
  String net = "";
  String weitere = "";

  // Anfang Ereignisprozeduren
  public String getSelectedRadioButton(CheckboxGroup cg) {
    return cg.getSelectedCheckbox().getLabel();
  }

  public void btnUebernehmen_ActionPerformed(ActionEvent evt) {
    // Daten ermitteln:
    name = this.txtName.getText();
    vorname = this.txtVorname.getText();
    plz = this.txtPlz.getText();
    ort = this.txtOrt.getText();
    strasse = this.txtStrasse.getText();
    geschl = getSelectedRadioButton(this.geschlecht);

    if (this.ckProg.getState()) {
      this.prog = "Programmiertechnik";
    }

    if (this.ckBetr.getState()) {
      this.betr = "Betriebssysteme";
    }

    if (this.ckNet.getState()) {
      this.net = "Netzwerktechnik";
    }

    weitere = this.textArea.getText();

    // Daten prüfen:
    // 1. PLZ:
    Pattern p = Pattern.compile("^[0-9][1-9][0-9]{3}$");
    Matcher m = p.matcher(this.plz);
    boolean plzOk = m.matches();

    if (!plzOk) {
      this.txtPlz.setBackground(Color.RED);
      this.txtPlz.setText("");
      this.txtPlz.requestFocus();
    } else {
      this.txtPlz.setBackground(Color.WHITE);
    }

    // 2. sonstige Daten:
    boolean datenOk = (!name.equals("")) && (!vorname.equals("")) &&
                      (!plz.equals("")) && (!ort.equals("")) &&
                      (!strasse.equals(""));

    if (!datenOk) {
      this.lblTitel.setForeground(Color.RED);
      this.lblTitel.setText("Bitte alle Felder ausfüllen");
    } else {
      this.lblTitel.setForeground(Color.BLACK);
      this.lblTitel.setText("Eingabeformular");
    }

    // Daten speichern:
    try {
      this.speichern();
    }catch(IOException e) {
      System.out.println("Fehler in speichern()");
    }
    // Dialog, weiteren Datensatz eingeben:
    if((datenOk) && (plzOk)) {
      this.nochmal();

    }

  }

  public void btnLoeschen_ActionPerformed(ActionEvent evt) {
    this.loeschen();
  }

  public void  btnErster_ActionPerformed(ActionEvent evt) {
	  
  }
  public void  btnLetzter_ActionPerformed(ActionEvent evt) {

  }
  public void  btnVorwaerts_ActionPerformed(ActionEvent evt) {

  }
  public void  btnZurueck_ActionPerformed(ActionEvent evt) {

  }
  // Ende Ereignisprozeduren
  // eigene Methoden:
  private void speichern() throws IOException {
    this.save.makeDir("csv");
    
    this.save.makeFile("Daten.csv");
    this.save.schreibeCsvZeile(this.name, this.vorname, this.plz, this.ort,
                               this.strasse, this.geschl, this.prog, this.betr,
                               this.net, this.weitere, ';');
  }
  
  private void loeschen() {
    this.txtName.setText("");
    this.txtVorname.setText("");
    this.txtPlz.setText("");
    this.txtOrt.setText("");
    
    this.txtStrasse.setText("");
    this.rbM.setState(true);
    this.rbW.setState(false);
    this.ckProg.setState(false);
    this.ckBetr.setState(false);
    this.ckNet.setState(false);
    this.textArea.setText("");
    // Fehlermeldungen löschen:
    this.lblTitel.setForeground(Color.BLACK);
    this.lblTitel.setText("Eingabeformular");
    this.txtPlz.setBackground(Color.WHITE);
  }
  
  private void nochmal() {
    this.dlg.setVisible(true);
    // Antwort auswerten:
    if(this.dlg.getAntwort()) this.loeschen();
    System.exit(0);

  }
  
  /*public void dateiEinlesen(String datei) throws FileNotFoundException, IOException
  {
	  BufferedReader reader = new BufferedReader(new FileReader("C:/Dokumente und Einstellungen/tgrahl/Eigene Dateien/workspaces/Test/Project/csv/Daten.csv"));
      
      String strLine;
      String[] items;
      while ( reader.ready()) {
        items = reader.readLine().split(";");
        System.out.println(items[0]);
      }
  
  }*/
 
Moin,

speicher deine Einträge doch beim Einlesen in einer List zwischen. Dann kannst du immer schön 10 Einträge anzeigen und dann weiterpagen.

Chriz
 
Mhm, aber nur weil du's bist.

Hier lese ich eine CSV aus, splitte sie, speicher Sie in eine schöne vorgegebene Datenstruktur und kann sie anschließend strukturiert wieder auslesen.



Java:
package Sandkasten;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Vector;

/**
 * 
 * @author Chriz
 *
 * Tutorials.de Beispiel
 */
public class Sandkasten {
	
	/**
	 * Datenhaltung innerhalb eines Vectors
	 */
	private Vector<SplitDatenhalter> datenhalter = new Vector<SplitDatenhalter>();
	/** aktuelle Seite **/
	private int current_page = 0;

	
	public Standkasten(){
		try{
			/** Einlesen der Datei **/
			File f = new File("meineDatei.csv");
			BufferedReader bf = new BufferedReader(new FileReader(f));
			String line = "";
			
			while((line = bf.readLine())!=null){
				String[] splittedLine = line.split(",");
				datenhalter.add(new SplitDatenhalter(splittedLine[0],splittedLine[1],Integer.parseInt(splittedLine[2])));
			}
		}catch(Exception e){
			e.printStackTrace();
		}		
	}
	
	private void pageForward(){
		if(datenhalter.size()>=(current_page+1)){
			current_page++;
			ausgabe_namen.setText(datenhalter.get(current_page).getName());
			ausgabe_alter.setText(datenhalter.get(current_page).getAlter());
			ausgabe_adresse.setText(datenhalter.get(current_page).getAdresse());
		}
	}
	
	private void pageBackward(){
		if((current_page-1)>0){
			current_page--;
			ausgabe_namen.setText(datenhalter.get(current_page).getName());
			ausgabe_alter.setText(datenhalter.get(current_page).getAlter());
			ausgabe_adresse.setText(datenhalter.get(current_page).getAdresse());
		}
	}
	
	public static void main(String a[]){
		new Sandkasten();
	}
	
	/**
	 * Sub-Klasse für die Datenhaltung
	 * @author Chriz
	 *
	 */
	private class SplitDatenhalter{
		
		String name;
		String adresse;
		int alter;
		
		public SplitDatenhalter(String name, String adresse, int alter){
			this.name 		= name;
			this.adresse 	= adresse;
			this.alter 		= alter;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getAdresse() {
			return adresse;
		}

		public void setAdresse(String adresse) {
			this.adresse = adresse;
		}

		public int getAlter() {
			return alter;
		}

		public void setAlter(int alter) {
			this.alter = alter;
		}
		
	}
}
 
Ok danke aber ich versteh des leider trotzdem noch net so richtig bzw verwirrt mich mit den pages.. Den Try block hab ich auch hinbekommen. Könntest du mir des vlt bei meinem Code zeigen damit ich das versteh. Wäre echt net von dir
 
Was genau hast du nicht verstanden? Ich habe so die vermutung das du bisher noch nicht viel in Java gemacht hast wenn ich mir deinen Code so ansehe...
 
Genau so ist es bin noch anfänger. Hab des in meiner Freizeit bzw zur Übung gemacht. Deswegen wäre es net wenn du mir des bei meinem COde zeigen würdest. Wie gesagt hab zwar jetzt viel rumprobiert aber ich bekomms einfach net hin.
Ich versteh des mit dem Splitthalter net weil wenn ich die daten abspeicher werden die ja net in die klasse splitterhalter gespeichert sondern in die csv(def u.a. in der Klasse Speichern).
Klingt zwar verwirrent aber ich denk du weist was ich mein^^.
normalerweise will ich nix gelöst bekommen da es mir spaß macht selbst auf die lösung zu kommen aber in diesmal fall verzweifel ich. es wäre mir eine große hilfe wenn du mir das lösen könntest. Falls es dir nix ausmacht kannst du dann auch bei den sachen die du geändert hast noch ein kleinen Kommend dazu schreiben damit ich das nachvollziehen kann. Echt voll net von dir das du dir bis jetzt die zeit genommen hast
 
Zuletzt bearbeitet:
gehen wir anders vor, ich erkläre dir meinen code, vielleicht kannst du dadurch auf deinen code abstrahieren.

also, im Konstruktor lese ich wie du richtig erkannt hast die Datei ein. Das hast du ja auch schon gemacht, also kein großeses Kunststück.

Nun gibt es die private Klasse
Java:
SplitDatenhalter
. Hui, sieht böse aus, ist aber eigentlich ganz einfach. Java ist wie du sicherlich weißt objektorientiert. Jede Klasse ist ein Objekt. Ein Vector ist eine Art von Liste. Du kannst ihn dir wie einen Eimer vorstellen. Ab Java 5 gibt es die möglichkeit, Vectoren zu typisieren. Das heißt dann so.
Java:
private Vector<SplitDatenhalter> datenhalter = new Vector<SplitDatenhalter>();
(Der Vector ist Typisiert mit "Splitdatenhalter", d.h. nur diese Art von Objekten dürfen da rein) Das kannst du dir nun im Grunde vorstellen als wenn du einen Zettel auf den Eimer klebst auf dem steht: "Nur Wilson Tennisbälle".

Du darfst also nur Tennisbälle (Objekte) vom Typen "Wilson" in den Eimer (Vector) packen. Und da du weißt welche Objekte (Tennisbälle) drinn sind, weißt du auch die eigenschaften von denen..

Klingt komisch, is aber so. D.h. unsere schöne Klasse "SplitDatenhalter" hat die Eigenschaften "getName(), getAlter()" usw. und ich kann sie über den VEctor direkt ansprechen weil dieser Typisiert (Denk an den Zettel) ist, sprich ich weiß was drinn ist.

So, ich erzeuge also eine Klasse, die alle Felder deines Eingabefeldes abdeckt, die da z.B. sind: Platz, Ort, Kentnisse usw

Sprich du musst die SplitDatenhaltung erweitern. String Ort, String platz und die entsprechenden getter und setter methoden (getOrt(), getPlatz())

in datenhalter.add(new SplitDatenhalter()) erzeugst du dann ein neues Objekt der Klasse Splitdatenhalter, indem du alle Werte aus der CSV Datei übergeben kannst.

Das Paging geht dann anschließend durch den VEctor und ließt die Daten aus dem Vector aus. Du hast ja durch die Schleife im Konstruktor die Daten aus der CSV Datei in diesem Vector (Eimer) zwischengepuffert.

Ich hoffe das war verständlich, ließ es ruhig und am besten 1-2 mal um es wirklich zu verstehen.

LG
Chriz
 
Ok das ich die Klasse erweitern muss war mir klar.

==>in datenhalter.add(new SplitDatenhalter()) erzeugst du dann ein neues Objekt der Klasse Splitdatenhalter, indem du alle Werte aus der CSV Datei übergeben kannst.
Code:
 datenhalter.add(new SplitDatenhalter(splittedLine[0],splittedLine[1],Integer.parseInt(splittedLine[2])));
das sind ja die einzelnen Werte die mit ; getrennt sind.
ich hab das jetzt mal alles auf mein Programm geändert und bekomm ne Fehlermeldung
java.lang.ArrayIndexOutOfBoundsException: 1
was genau beduetet das
 
Zeig mir mal einen Eintrag aus deiner CSV Datei. Wenn du mehr ausließt (mit splittedLine[x]) dann bekommst du eine OutofBoundsexception.

OutofBounds bedeutet, dass der index höher war als die Menge der Dtaen in dem Vector, bzw array.

gib doch mal splittedLine.length aus (system.out...)

so, ich muss nun in einem Termin, meld mich morgen wieder falls du das nicht bis dahin hinbekommen hast.

cul8ter
chriz
 

Neue Beiträge

Zurück