Hallo, ich soll ein kleines Programm zum Einlesen, Manipulieren und Schreiben von CSV Dateien implementieren, stehe da aber schon zu Beginn vor einigen Problemen, da ich noch nie mit so etwas gearbeitet habe!
Java:
publicclassCsvTable{//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. publicCsvTable(){char seperator =',';String[][] csvtabelle;}
In dieser ersten Methode sollen wir wie beschrieben eine leere Tabelle erzeugen.
Mein Problem ist folgendes, die Tabelle sollte ein Array oder eine ArrayList sein, was ist damit gemeint, oder wie wird das Trennzeichen denn im array gesetzt, des weiteren ist ein array ja eigentlich statisch, wenn ich aber unterschiedlich lange Dateien habe muss ich ja z.B. die Spaltenzahl variieren können???
Hast du den Code so bekommen oder selbst geschrieben?
Normalerweise würde ich davon ausgehen, dass der Separator nicht in das Array hineingeschrieben wird, sondern es einmal eine Datenstruktur gibt, die die Inhalte der Tabelle darstellt (z.B. ein Array oder eine ArrayList) und dazu dann eine Variable, unter der das Separatorzeichen abgelegt ist.
Wenn man dann die Daten in die Datei schreibt, wird der entsprechende Separator zwischen die einzelnen Einträge gesetzt.
Mein Problem ist folgendes, die Tabelle sollte ein Array oder eine ArrayList sein, was ist damit gemeint, oder wie wird das Trennzeichen denn im array gesetzt, des weiteren ist ein array ja eigentlich statisch, wenn ich aber unterschiedlich lange Dateien habe muss ich ja z.B. die Spaltenzahl variieren können???
Dafür ist eine ArrayList -bzw. allgemein die Collections von Java- geeigneter weil ihre Größe dynamisch ist. Eine Liste ist aber 1-dimensional, eine Tabelle wie du sie möchtest 2-dim.. Also wäre in diesem Fall eine
Code:
List< List<String> >
notwendig.
Man kann zwar auch mit Arrays "dynamisch" arbeiten, das macht man auch wieder nichts anderes als die ArrayList
Den Kommentar den du siehst, das ist die Aufgabenstellung zur ersten Methode!
Die weiteren Methoden sind:
Java:
publicclassCsvTable{//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. publicCsvTable(){char seperator =',';String[][] csvtabelle;}/*Initialisiert eine leere Tabelle und setzt das gegebene Trennzeichen.
*Es sind nur die Trennzeichen Komma, Semikolon und Doppelpunkt erlaubt.
*Wird ein anderes Trennzeichen uebergeben, so ist eine IllegalArgumentException zu werfen.
*/publicCsvTable(Character separator){char seperator =';';if(seperator !=','|| seperator !=';'|| seperator !=':'){thrownewIllegalArgumentException("Trennzeichen ist kein Komma, Smikolon oder Doppelpunkt!");}else;}/*
* Speichert den Wert in value in die gegebenen Zeile und Spalte. Zeilen und Spalten werden ab 0 gezaehlt!
* Da die Tabelle beliebig groß werden kann, muessen Sie darauf achten die Groeße entsprechend anzupassen.
* Wird ein Wert uebergeben, der das Trennzeichen enthaelt, so soll eine MalformedValueException geworfen werden.
* Ebenso sind negative Werte für Zeilen- und Spaltenangaben nicht zugelassen.
* In diesem Fall soll eine IllegalArgumentException geworfen werden.
*/publicvoidsetValue(int row,int column,String value){}/*
* Liefert den in der Zeile row und Spalte column gespeicherten Wert zurueck.
* Bei negativen Eingaben soll eine IllegalArgumentException geworfen werden.
* Zeilen und Spalten werden ab 0 gezaehlt! Existiert an dieser Stelle kein Wert, so wir der leere String "" zurueckgegeben.
*/publicStringgetValue(int row,int column){}//liefert das TrennzeichenpublicCharactergetSeparator(){}/*
* Liefert die Anzahl der benutzten Spalten. Spalten in denen der leere String "" steht gelten nicht als benutzt.
* Ermitteln Sie hier unter allen Zeilen diejenige mit der groeßten benutzten Spalte.
*/publicintgetColumns(){}/*
* Liefert die Anzahl der benutzten Zeilen.
* Eine Zeile gilt als genutzt, wenn Sie mindestens einen vom leeren String verschiedenen Wert in einer Spalte besitzt.
*/publicintgetRows(){}//Liefert den aktuellen Stand der Tabelle als String zurueck.publicStringtoString(){}}//Ende Klasse CsvTable
Warum werden da Variablen im Konstruktor deklariert? Die siehst du doch nie mehr wieder. Solltest du die Daten und den Separator nicht vielmehr als Felder der Klasse deklarieren und sie im Konstruktor initialisieren?
public CsvTable()
Hier liegt ja grundsätzlich mal mein erstes Problem, wie ich oben beschrieben habe, die Tabelle soll ein array oder eine arraylist sein.
Aber wie mache ich das, da ein array normalerweise ja statisch ist!
Ausserdem ist der Code im zweiten Konstruktor auch nicht korrekt.
Eine IllegalArgumentException würde in dem fall nie auftretten
Und Instanzvariablen sind auch nicht vorhanden, aber das solltet ihr wohl implementieren.
Aber wie mache ich das, da ein array normalerweise ja statisch ist!
Naja entweder verwendest du eine ArrayList oder erweiterst eine Array.
Z.b neues Array erzeugen mit neuer Größe, Werte vom alten Array übernehmen und neue Werte hinzufügen.
public CsvTable()
Hier liegt ja grundsätzlich mal mein erstes Problem, wie ich oben beschrieben habe, die Tabelle soll ein array oder eine arraylist sein.
Aber wie mache ich das, da ein array normalerweise ja statisch ist!
Dann nimm, wie schon geschrieben eine ArrayList, die ist nicht statisch.
Java:
ArrayList<String> enememu =newArrayList<>();
Aber wenn ich den Code im Konstruktor sehe, habe ich nicht den Eindruck, dass du wirklich weißt, was du da tust. Weißt du, wie Attribute aka Klassenvariablen funktionieren? Weißt du, was ein Konstruktor macht und warum deine Implementierung davon fragwürdig ist?
Außerdem solltest du dir vorher klar machen, was du tun willst, bevor du einfach lostippst und dich um Kopf und Kragen codest.
Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!
Ok und was meint das ganze jetzt mit trennzeichen setzten usw?
Hm, du meintest ich soll mich nicht um Kopf und Kragen programmieren, aber so alt bin ich noch nicht was Java angeht, die Aufgabe an sich ist wahrscheinlich gar nicht mal schwer!
Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!
Eine CSV-Datei stellt eine Tabelle dar. Dabei sind die einzelnen Spalten durch ein bestimmtes Zeichen und die einzelnen Reihen durch Zeilenumbrüche getrennt. Dieses "bestimmte" Zeichen kann z.B. ein Semikolon oder ein Komma sein. Allerdings muss es für die Datei einheitlich sein und darf natürlich nicht in den Datensätzen vorkommen. Programme wie Excel können solche Formate lesen und darstellen. Excel-Tabellen können auch im CSV-Format gespeichert werden (CSV steht übrigens für Comma Separated Values, also "durch Kommas getrennte Werte").
Ich gehe einmal davon aus, dass der Sinn der Aufgabenstellung ist, die Werte in einer geeigneten Datenstruktur abzuspeichern und sich dazu zu merken, welches Zeichen das Trennzeichen ist. Auf diese Weise kann man später damit CSV-Dateien schreiben und lesen.
Ich denke nicht, dass das Trennzeichen von anfang an in die Tabelle hineingeschrieben werden soll.
Du solltest dir also zuerst eine geeignete Datenstruktur bauen, die die Tabelleneinträge aufnehmen kann und das Trennzeichen irgendwo festlegen.
Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!
ja so würde es funktionieren bzw intern arbeitet eine Liste so. Wenn du eine Wert setzt der ausserhalb deines Arrays ist dann musst du ein neues der entsprechenden größe machen und alle werte umkopieren....
Heißt jetzt dein array oder array list, dass du beides machen musst oder dass du dir es aussuche kannst?
publicclassCsvTable{//neue leere TabelleString[][] tabelle =null;//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. publicCsvTable(){char trennzeichen =',';
tabelle =newString[0][0];}/*Initialisiert eine leere Tabelle und setzt das gegebene Trennzeichen.
*Es sind nur die Trennzeichen Komma, Semikolon und Doppelpunkt erlaubt.
*Wird ein anderes Trennzeichen uebergeben, so ist eine IllegalArgumentException zu werfen.
*/publicCsvTable(Character separator){if(separator !=','|| separator !=';'|| separator !=':'){thrownewIllegalArgumentException("Trennzeichen ist kein Komma,Smikolo
oder Doppelpunkt!");}else;}publicvoidsetValue(int row,int column,String value){for(int x =0; x < tabelle.length; x++){for(int y =0; y < tabelle.length; y++){if(tabelle[x][y]!=null){
tabelle =newString[x+1][y+1];}else;}}}
Meine setValue soll dan wohl i-wei dazu da sein um die Tabelle gegebenenfalls zu erweitern!
Wenn ich den Wert value in die Tabelle speichern will, sieht das dann so aus?
Java:
publicvoidsetValue(int row,int column,String value){//ich sehe mir die Zeile an, wenn diese nicht vorhanden ist erzeuge ich eine neue!?ArrayList<String> rowData = tabelle.get(row);if(rowData ==null)
rowData =newArrayList();//Wert in das Feld setzen
rowData.set(column, value);//Zeile zurück in die Tabelle schreiben
tabelle.set(row, rowData);}
Habe ich das so einigermaßen richtig verstanden und gemacht???
MfG
publicvoidsetValue(int row,int column,String value){//wenn Zeile noch nicht vorhanden eine anlegenArrayList<String> rowData = tabelle.get(row);if(rowData ==null)
rowData =newArrayList();//Wert in das Feld setzen
rowData.set(column, value);//Zeile zurück in die Tabelle schreiben
tabelle.set(row, rowData);}
Und wie bekomme ich denn die Zeilen und Spaltenzahl der Liste als int-Wert?