csv Dateien und ihr Handling

Zenic

Mitglied
Hallo,

ich schreibe gerade eine Anwendung mit der ich diverse Produkte verwalten kann. Diese Produkte besitzen ~16 Eigenschaften (Attribute) welche ich in einer csv-Datei speichere und beim Programmstart auslese. (Zurzeit nur rund 150 Datensätze, werden aber mehr) Ist es möglich zu definieren, dass die Software alle Attribute eines Objekt, getrennt durch ";", in eine Datei schreibt oder ist die folgende Möglichkeit die Einzige/Beste?

Also bisher mache ich das lesen so
Java:
try {
			br = new BufferedReader(new FileReader(csvUrl));			
			while ((line = br.readLine()) != null) {
				String[] splitlineCache = line.split(";");
				ArrayList<String> splitline = new ArrayList<String>(Arrays.asList(splitlineCache));
				if(splitline.size() < 12){
					for(int i = splitline.size(); i < 12; i++){
						splitline.add("1");
					}
				}
				products.add(new Product(splitline.get(0), splitline.get(1), splitline.get(2),
 splitline.get(3), Integer.valueOf(splitline.get(4)), splitline.get(5),
						splitline.get(6), splitline.get(7), splitline.get(8), 
splitline.get(9), Integer.valueOf(splitline.get(10)),
						splitline.get(11)));
		
			}
		}

und das schreiben so:
Java:
public void writeProductToCSVFile(String csvUrl, Product p) {
		try {
			FileWriter fw = new FileWriter(csvUrl, true);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.newLine();
			bw.write(createStringForCSV(p));
			bw.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	private String createStringForCSV(Product p){
		StringBuilder sb = new StringBuilder();
		sb.append(p.getA());
		sb.append(";");
		sb.append(p.getB());
		sb.append(";");
		sb.append(p.getC());
		sb.append(";");
		sb.append(p.getD());
		sb.append(";");
		sb.append(p.getE());
		sb.append(";");
		etc. ...

		return sb.toString();
	}

Besonders beim schreiben erscheint mir dieses aneinander schreiben von ".append()" etwas umständlich und unschön.

Eine weitere Frage, sind csv Dateien für eine Anzahl von 10 Attribute + überhaupt noch zu gebrauchen oder sollte man auf andere Datenstrukteren (DB) umsteigen?

Danke
Zenic
 
Zuletzt bearbeitet:
automatisieren kann man nur mit der großen Keule,
man beschreibt die zu exportierenden Attribute in einer XML-Datei oder per Annotations in der Klasse (oder einfach alle)

und irgendein Framework mit zahllosen Methodenaufrufen + Reflection liest die Daten aus + speichert sie in irgendeinem geordneten Format,
CSV dann sicher nicht mehr, eher in Richtung XML

-------

dein Code ist so schon von der Grundart ganz gut,
falls es dir zuviel zu tippen, zuviel Code ist, kann man mit Hilfsmethoden manches vereinfachen,

Schreiben:
ganz leicht wäre ja eine Methode
appendWithSemikolon(StringBuilder, String)
die automatisch ein Semikolon anfügt, spart die Häfte der Zeilen

dann noch eine Methode, die mehrere Strings als Parameter annimmt und diese in mehrere Einzelaufrufe umwandelt,
entweder mit fester Anzahl Parameter oder variable, String... ist da ganz nett,

dann noch eine neue Klasse CSVBuilder statt StringBuilder und schon könntest du eigentlich

Java:
 private String createStringForCSV(Product p){
       return new CSVBuilder(p.getA(), p.getB(), p.getC(), ..).toString();
 }
schreiben

(edit: primitive Datentypen wie int stören da etwas)

----

Lesen:
da hast du das sogar schon auf eine Zeile verengt, nur die Aufrufe pro Eintrag sind noch recht lang,
mit einem kürzeren Variablenname und einer eigenen Klasse mit entsprechenden Hilfsmethoden könnte das auch

Java:
new Product(s.get(0), s.get(1), s.get(2), s.get(3), s.getInt(4), ...);
lauten, s vom Typ SplitCSVLine oder so

oder mit einem String-Array + Hilfsmethode toInt()
Java:
new Product(s[0], s[1], s[2], s[3], toInt(s[4]), ...);
bzw.
new Product(s[0], s[1], s[2], s[3], toInt(s,4), ...);

------

lohnt sich natürlich alles erst, wenn man dieses Verfahren mehrmals machen muss,
bei nur einer Klasse ist die Definition der Hilfsmethoden/ -klassen länger als der bisherige Code
 
Zuletzt bearbeitet von einem Moderator:
Danke, werd versuchen die Aufgaben so sinnvoll wie möglich aufzuteilen.

(edit: primitive Datentypen wie int stören da etwas)
Das hab ich mittlerweile auch gemerkt, da die meisten Attribute rein der Beschreibung des Produkts dienen und mit ihnen nicht gerechnet oder sonst was wird, werde ich sie wohl alle als String abspeichern.
 

Neue Themen


Zurück
Oben