CSV Datei Hilfe zur Aufgabe bidde

julia123

Erfahrenes Mitglied
hi ihr lieben,
ich muss für die uni noch eine aufgabe lösen. kann mir bitte jemand helfen. Also ich komm zum Punkt. Es geht dadrum ein Program zu erweitern das CSV Datein ex- und importiert. Die Aufgabe hab ich so gelöst:
Code:
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class CSV {
	/**
	 * Lokalisiert Datei 
	 * @param msg
	 * @param contentTypes
	 *            Liste von Typen, von denen einer der Datei zugeornet sein muss
	 *            Pfad der ausgwaehlten Datei
	 * @return
	 * @throws IOException
	 */
	public static Path locateFileWithType(String msg, String... contentTypes)
			throws IOException {
		JFileChooser fc = new JFileChooser();
		File f = null;
		Path p = null;
		while (true) {
			int returnVal = fc.showDialog(null, msg);
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				f = fc.getSelectedFile();
				p = f.toPath();
				if (Files.isRegularFile(p) && Files.isReadable(p)) {
					for (String type : contentTypes) {
						if (Files.probeContentType(p).equals(type)) {
							return p;
						}
					}
				}
				JOptionPane.showMessageDialog(null,
						"Der Datei Typ ist nicht CSV!");
			} else
				return null;
		}
	}

	/**
	 * Liest eine Menge von Einträgen aus eine CSV-Datei (’,’-Separiert) und
	 * fügt diese Einträge in das Telefonverzeichnis ein, dabei gelten die
	 * gleichen Regeln wie berreits für addEntry
	 * 
	 * @return Anzahl der gelesenen Einträge
	 * @throws IOException
	 *             wenn file nicht lesbar oder ähnliches
	 */
	public static Map<String, String> readCSVFile(Path path, String seperator)
			throws IOException {
		boolean firstLine = true; // erste Zeile enthaelt Spalten? (=Attribut?)
									// Namen
		Map<String, String> entry = new HashMap<>();
		for (String line : Files.readAllLines(path, Charset.defaultCharset())) {
			if (firstLine) {
				firstLine = false;
				continue;
			}
			String[] values = line.split(seperator);
			entry.put(values[0] + " " + values[1], values[2]);
		}
		JOptionPane.showMessageDialog(null, "Einträge wurden importiert");
		return entry;
	}

	/**
	 * Schreibt alle Telefonbucheinträge in eine CSV-Datei
	 * 
	 * @return Anzahl der geschriebenen Einträge oder -1 falls
	 * @throws IOException
	 *             wenn file nicht schreibbar oder ähnliches
	 */
	public static void writeCSV(String path, String seperator)
			throws IOException {

		Map<String, String> allEntries = TelephoneDirectory.getpersEintrag();

		FileWriter writer = new FileWriter(path);

		StringBuilder entry = new StringBuilder();
		entry.append("Name" + seperator); // Erste Zeile erstellen
											// (Name|Vorname|Nummer)
		entry.append("Vorname" + seperator);
		entry.append("Nummer" + seperator + "\n");

		for (String line : allEntries.keySet()) { // String erzeugen der in die
													// CSV-Datei geschrieben
													// werden soll
			String[] entries = line.split("\\s", 2);
			entry.append(entries[0] + seperator);
			entry.append(entries[1] + seperator);
			entry.append(allEntries.get(line) + "\n");
		}
		writer.append(entry);
		writer.flush();
		writer.close();
		JOptionPane.showMessageDialog(null, "Einträge wurden exportiert");
	}
}

Das Programm funktioniert. Jedoch steht in der Fragestellung:

Erweitern Sie Ihre Lösung von Aufgabe 8 um

• die Möglichkeit die Datensätze des Verzeichnisses in einer CSV-Datei zu speichern und um

• die Möglichkeit das Verzeichnis mit den Datensätzen aus einer CSV–Datei initialisieren.

Das Format dieser Dateien soll sein:
Name,Vorname,Nr

BSP:
Müller,Lieschen,0123456
Hirsch,Hansi,336699
Pettersson,Findus,198400

Implementieren Sie dazu folgende Funktionen:
Code:
/**
* Schreibt alle Telefonbucheinträge in eine CSV-Datei
*
* @return Anzahl der geschriebenen Einträge oder -1 falls
* @throws IOException wenn file nicht schreibbar oder ähnliches
*/
public static int writeCSV(File file) throws IOException {
}
/**
* Liest eine Menge von Einträgen aus eine CSV-Datei (’,’-Separiert)
* und fügt diese Einträge in das Telefonverzeichnis ein, dabei gelten
* die gleichen Regeln wie berreits für addEntry
*
* @return Anzahl der gelesenen Einträge
* @throws IOException wenn file nicht lesbar oder ähnliches
*/
public static int readCSV(File file) throws IOException {
}

Mein Problem ist jetzt, ich hab die Schnittstelle manipuliert ? seh ich das richtig? weil auf sollche sachen wird besonders geachtet. Hinzu kommt das ich einfach mit
Code:
public static int writeCSV(File file) throws IOException {
}
nicht klar komme wie ich das lösen kann.
 
Zuletzt bearbeitet:

sheel

I love Asm
Hi

dein Problem ist also "nur", dass Returnwert und Parameter nicht so sind,
wie in der Aufgabenstellung beschrieben?
Und die zwei Methoden sind wirklich von dir geschrieben? :rolleyes:
Weil dann sollte man das eigentlich leicht ändern können...
 

julia123

Erfahrenes Mitglied
ich gebe es zu nein.
ich guck mir die ganze zeit videos an und und. aber ich komm immer noch nicht drauf wie es geht :(

und ja das ist mein problem leider.......


ich versteh nicht was für ein int wert also zahl zurück gegeben werden soll? ich versteh denn sinn auch nicht wieso eine zahl ok bei writeCSV da kann man dann die anzahl der spalten zählen.
 
Zuletzt bearbeitet:

julia123

Erfahrenes Mitglied
Code:
	/**
	 * Liest eine Menge von Einträgen aus eine CSV-Datei (’,’-Separiert) und
	 * fügt diese Einträge in das Telefonverzeichnis ein, dabei gelten die
	 * gleichen Regeln wie berreits für addEntry
	 * 
	 * @return Anzahl der gelesenen Einträge
	 * @throws IOException
	 *             wenn file nicht lesbar oder ähnliches
	 */
	public static int readCSV(File file) throws IOException {//anfang
		
		int count = 1;
		boolean firstLine = true; // erste Zeile enthaelt Spalten? (=Attribut?)
									// Namen
		Map<String, String> entry = new HashMap<>();
		Path path = null;
		for (String line : Files.readAllLines(path, Charset.defaultCharset())) {
			if (firstLine) {
				firstLine = false;
				count++;
				continue;
			}
			String[] values = line.split(",");
			entry.put(values[0] + " " + values[1], values[2]);
		}
		JOptionPane.showMessageDialog(null, "Einträge wurden importiert");
		
		return count;
	}

ich hab das jetzt so gemacht ist das richtig?

@saftmeister es sind doch immer nur 3 zeilen ...? name vorname telenummer
 

saftmeister

Nutze den Saft!
Der count wird auch nur beim ersten Durchlauf hoch gezählt, denn das Inkrementieren findet nur in der if(firstline) statt, welche sogleich auf false gesetzt wird. Nimm den count++ mal aus der if-Bedingung raus und schieb in statt dessen vor die String[]-Zeile. Außerdem ist es schlecht, den Counter mit 1 zu initialisieren. Was passiert denn, wenn außer der Headline gar keine weiteren Zeilen in der CSV drin sind?
 

julia123

Erfahrenes Mitglied
ok ich hab das jetzt so verbessert
Code:
public static int readCSV(File file) throws IOException {// anfang

		int count = 1;
		boolean firstLine = true; // erste Zeile enthaelt Spalten? (=Attribut?)
									// Namen
		Map<String, String> entry = new HashMap<>();
		Path path = null;
		for (String line : Files.readAllLines(path, Charset.defaultCharset())) {
			if (firstLine) {
				firstLine = false;
				
				continue;
			}
			count++;
			String[] values = line.split(",");
			entry.put(values[0] + " " + values[1], values[2]);
		}
		JOptionPane.showMessageDialog(null, "Einträge wurden importiert");

		return count;
	}

Soweit ich verstanden hab wird das jetzt in der UI abgefangen:
Code:
	if (mainMenuS[5].equals(selectedRB)) { // Eintrag abfragen
				Path path = CSV.locateFileWithType("CSV Datei", "text/csv",
						"text/comma?separated?values");
				if (path == null) {
					continue;
				}
				String[] entry = new String[2];
				Map<String, String> records = CSV.readCSVFile(path, ",");
				if (records == null) {
					continue;
				} else {
					for (String eintrag : records.keySet()) {
						entry = eintrag.split("\\s", 2);
						TelephoneDirectory.addEntry(entry[0], entry[1],
								records.get(eintrag));
					}
				}
				continue;
			}


ich hab jetzt noch ein weiters problem. Ich möchte eine csv datei importieren wenn ich jetzt eine mit exel erstelle oder eine über texteditor( mit "," zeile trenne) funktionier das nicht es zeigt mir immer den fehler das das keine csv ist.
 

saftmeister

Nutze den Saft!
Wo kommt diese Fehlermeldung her? In dem bisher geposteten Code ist so eine Meldung nicht vorhanden. Kommt die evtl. bei CSV.locateFileWithType() als Exception? Hast du einen Stacktrace?
 

julia123

Erfahrenes Mitglied
das ist jetzt unabhängig von der aufgabe:
Code:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class Test {
   /**
    * Lokalisiert Datei mit einem der vorgebenen MIME-Typen.
    *
    * @param msg
    *            Text fuer die Dateiauswahl
    * @param contentTypes
    *            Liste von Typen, von denen einer der Datei zugeornet sein muss
    * @return Pfad der ausgwaehlten Datei
    * @throws IOException
    */
   private static Path locateFileWithType(String msg, String... contentTypes)
         throws IOException {
      JFileChooser fc = new JFileChooser();
      File f = null;
      Path p = null;
      while (true) {
         int returnVal = fc.showDialog(null, msg);
         if (returnVal == JFileChooser.APPROVE_OPTION) {
            f = fc.getSelectedFile();
            p = f.toPath();
            if (Files.isRegularFile(p) && Files.isReadable(p)) {
               for (String type : contentTypes) {
                  if (Files.probeContentType(p).equals(type)) {
                     return p;
                  }
               }
            }
            JOptionPane.showMessageDialog(null,
                  "Die Datei hat nicht den richtigen Typ");
         } else
            break;
      }
      return null;
   }

   public static void main(String[] args) throws IOException {
      Path path = locateFileWithType("CSV Datei", "text/csv",
            "text/comma-separated-values");
      JOptionPane.showMessageDialog(null, "Sie haben gewaehlt:" + path);
   }
}
hier war die aufgabe einfach zugucken wie mein system mit csv datein umgeht und ihr typ erkennt. und ja das ist der ganze code... und was ist ein Stacktrace das höre ich zum ersten mal. ich weiss nur das es da unteschiede zu java 7 und 6 gibt. ich benutze java 7 und win8 und exel 2010

und tut mir leid ich meine keine "fehler meldung" . ich kann mit dem code einfach kein csv erkennen. also den datei typen erkennen. was machich falsch?