Weißt du das ist per Objektorientierung ganz einfach:
Hier mal ein Beispiel eines Einfachen CSVParsers:
CSVFile.java
public class CSVFile {
private ArrayList<CSVItem> itemList = new ArrayList<CSVItem>();
String filePath = "";
public CSVFile(String path)
{
this.filePath = path;
File fl = new File(path);
FileInputStream fin;
try {
fin = new FileInputStream(fl);
BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
String line = null;
while ((line = reader.readLine()) != null)
{
if(line.contains(";"))
{
CSVItem item = new CSVItem(line);
itemList.add(item);
}
}
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public CSVItem getItemAt(int idx)
{
return itemList.get(idx);
}
public void removeItem(int idx)
{
itemList.remove(idx);
}
public void removeItem(CSVItem item)
{
itemList.remove(item);
}
public void addItem(CSVItem item)
{
itemList.add(item);
}
public void saveFile()
{
StringBuilder sb = new StringBuilder();
String newLine = System.getProperty("line.separator");
for(CSVItem cItem : itemList)
{
sb.append(cItem.buildCSVString()).append(newLine);
}
String fileString = sb.toString();
File newTextFile = new File(filePath);
FileWriter fw;
try {
fw = new FileWriter(newTextFile);
fw.write(fileString);
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Das ist die File Klasse, diese List dir den CSVFile ein und macht eine Liste Mit CSVItems (Die einzelnen Zeilen) draus.
Wenn man sich dann die CSVItem Klasse anschaut:
public class CSVItem {
private ArrayList<String> valueList = new ArrayList<String>();
public CSVItem(String csvLine)
{
if(csvLine.contains(";"))
{
String[] array = csvLine.split(";");
for(String item : array)
{
valueList.add(item.trim());
}
}
else
{
throw new IllegalStateException("CSVLine String does not contain ',' as Seperator");
}
}
public ArrayList<String> getValueList()
{
return valueList;
}
public String getValueAt(int idx)
{
return valueList.get(idx);
}
public void addValueAt(int idx,String value)
{
valueList.add(idx, value);
}
public void setValue(int idx,String value)
{
valueList.set(idx, value);
}
public void addValue(String value)
{
valueList.add(value);
}
public int getItemCount()
{
return valueList.size();
}
public String buildCSVString()
{
String csvLine = "";
for(String item : valueList)
{
csvLine += ";"+item;
}
return csvLine.substring(1);
}
public Object typeAs(Class<?> t)
{
try {
return t.getDeclaredConstructor(CSVItem.class).newInstance(this);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Das ganze habe ich mal rein Interessehalber gerade selbst gecodet
So um jetzt ein Wert abzurufen macht man folgendes:
CSVFile csv = new CSVFile("D:\\temp\\test.csv");
String value = csv.getItemAt(1).getValueAt(1);
Damit bekommst du den Wert der Zeile 2, 2. Spalte
Wie man in meinen beiden Klassen erkennen kann, ist es auch möglich, ein Wert über die Indices zu verändern, zu löschen oder die komplette Zeile zu löschen.
Und weil es so schön ist, kann man auch eigene Objekte einklinken, dies übernimmt die Methode typeAs(Class t)...
Da erstellt man dann eine Klasse und kann die CSV Daten da rein "kapseln", durch den Verweis/Pointer ist das Objekt aber immernoch in der ArrayList ist, werden auch aktualisierungen im Objekt übernommen.
Hier mal ein auf dich zugeschnittenes Beispiel:
public class CSVData
{
//CSV Index (Spalten) Definition
final int idxId = 0;
final int idxCity = 1;
final int idxParentId = 2;
CSVItem item; //lokales CSVItem
public CSVData(CSVItem csvLine) { //Konstruktor mit Verweis aufs CSVItem
item = csvLine;
}
public CSVData()
{
}
public int getId()
{
String idVal = item.getValueAt(idxId);//Id über Index lesen
return Integer.parseInt(idVal); // als Integer ausgeben
}
public String getCity()
{
return item.getValueAt(idxCity);//City über Index lesen
}
public int getParentId()
{
String pId = item.getValueAt(idxParentId);
return Integer.parseInt(pId);//ID parsen
}
public void setParentId(int id)
{
item.setValue(idxParentId, String.valueOf(id));//Id setzen
}
}
Damit das ganze jetzt funktioniert, muss man das Objekt Konvertieren:
CSVFile csv = new CSVFile("D:\\temp\\test.csv");
CSVItem item = csv.getItemAt(1);
CSVData data = (CSVData)item.typeAs(CSVData.class); // Hier hast du jetzt dein gekapseltes Objekt, mit welchem du weiterarbeiten kannst.
Will man jetzt was ausgeben lassen oder Werte verändern und in der XML speichern geht das genauso einfach.
Hier mal ein vollständiger ausschnitt:
CSVFile csv = new CSVFile("D:\\temp\\test.csv"); // CSV lesen
CSVItem item = csv.getItemAt(1); // 2. Zeile als Objekt bekommen
CSVData data = (CSVData)item.typeAs(CSVData.class); // Zeilen Objekt in das gekapselte konvertieren
System.out.print(data.getCity()); // Stadt ausgeben
data.setParentId(12); //neue ParentId setzen
csv.saveFile(); // CSV mit neuer parentID speichern
Das wärs eigentlich schon.
Damit kannst du alles Mögliche im CSV modifizieren.
Vielleicht noch ein Suchalgorithmus einbauen, dass zu gezielt Suchen kannst (z.b. für das entfernen von Zeilen)
Ach ja ich hab das bisher nur als Java Desktop getestet, in Android sollte, sobald der Pfad und die Berechtigungen drin sind, alles soweit funktionieren.
Mal sehen ob du das so brauchen kannst, wenn nicht auch nicht schlimm, war nen Test wie schnell ich sowas hinbekomme, Test hat ergeben ca. 45min-1h mit Bugfix und Test
LG Pascal //It's not a bug, it's a feature.
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.