Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben

deluxe1986

Mitglied
Hallo.
Ich hänge gerade an einem Problem bei dem JFileChooser und einer JTable. Ich gebe in die Tabelle Daten ein wobei eine für Zahlen vorgesehen ist. Danach wird die Datei in einer *.csv Datei gespeichert. Diese soll zu einem anderen Zeitpunkt wieder geladen und ergänzt werden. Hierbei kann es vorkommen, das es zwei gleiche Einträge gibt. Dann soll die Zahl verändert werden.

Soweit klappt das auch alles. Wenn ich die gespeicherte Datei jedoch in Excel verändere werden die Daten in der *.csv Datei in Anführungszeichen gespeichert. Wenn ich nun die Daten lade stehen die Zahlen auch in Anführungszeichen, wodurch ich die Zahlen nicht mehr verarbeiten kann. Das heißt ich müsste aus der *.csv Datei vorher die Anführungszeichen löschen ist dies irgendwie möglich, oder gibt es eine Möglichkeit andere Möglichkeit. Ich poste euch nochmal ein Beispiel meines FileChoosers zum Laden.

Java:
package Finanzen;
//
// Library Imports
import java.io.BufferedReader;
import java.io.File; 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*; 
 
@SuppressWarnings("serial")
public class OpenDlg2 implements java.io.Serializable
{ 
	/*Filechooser zum anzeigen des Öffnen Dialogs. Über diese Klasse wird das Öffnen
	 * der abgespeicherten Datei angezeigt.
	 * 
	 */
	public OpenDlg2()
	{
	  	//
		// Blatt 3
		
		//
		// Das Dialogfenster als Filechooser definieren
		JFileChooser chooser2 = new JFileChooser(); 
		//
		// Den Filechooser als Öffnen-Dialogfeld definieren
	  	int state2 = chooser2.showOpenDialog(null);
	  	//
	  	// Die gewählte Datei in den Programmcode übertragen
	  	File file2 = chooser2.getSelectedFile();
	  	//
	  	// Eine Integer Variable für die Spaltenanzahl angeben
	  	int k = 0;
	  	//
	  	// Ein String[] für die Daten angeben und initialisieren
	  	String[] rowData2 = null;
	  	//
		// Die Daten aus der Datei ins erste Tab übertragen
		try 
	  	{
			if (Tab3.table.getRowCount() != -1) 
			{
				//
				// Gesamte Tabelle Tab3 löschen
				for(int w=Tab3.table.getRowCount()-1;w>=0;w--) 
		    	{      
		    		Tab3.model.removeRow(w); 
		    	}
			}
			try
			{
				FileReader fr2 = new FileReader(file2);
				BufferedReader br2 = new BufferedReader(fr2);
				if (file2 != null && state2 == JFileChooser.APPROVE_OPTION)
			  	{
					String speicher = null;
					while((speicher = br2.readLine()) != null)
					{
						rowData2 = speicher.split(";");
						Tab3.model.addRow(rowData2);
						k = k + 1;
					}
			  	}
			}
			catch(NullPointerException npe)
			{
				
			}
		} 
	  	catch (FileNotFoundException e) 
	  	{
	  		JOptionPane.showMessageDialog(null, "Error! File not opened!");
		} 
	  	catch (IOException e) 
		{
	  		JOptionPane.showMessageDialog(null, "Error! File not opened!");
		}
	}
}

Die *.csv Datei sieht nach der Bearbeitung in OpenOffice so aus:

"ab";"cd";"500"
"ef";"gh";"400"

Muss aber so ausehen:

ab;cd;500
ef;gh;400


Danke im voraus.
 
dein Problem hat anscheinend nichts mit JFileChooser und sehr entfernt, quasi auch nichts mit JTable zu tun..,
du liest Text ein und trennst ihn nach Semikolon, entfernst aber nicht die Anführungszeichen, dann bleiben diese eben drin,
ist doch nicht überraschend?

keine der Standard-Java-Klassen kümmert sich um derartige Dinge, höchstens bei einem fertigen CSVParser a la
Simple demo of CSV parser class : CSV FileDevelopment ClassJava
bzw. ähnliche google-Ergebnisse könnte man das Abtrennen erwarten,
ansonsten dein String.split() um bisschen mehr Code erweitern
 
ja, das kannst du, wie ich auch geschrieben haben?

'entfernst aber nicht die Anführungszeichen'
'mehr Code'
usw.
 
Aber wie habs mit einem neuen split versucht aber da kommt ganz großer Müll bei rum. Der Aufruf der Split Methode ist doch nur mit dem Parameter regex möglich. Stell mich da jetzt sicherlich ziemlich dämlich an :-D . Aber ich versteh einfach nicht wie ich die wegbekommen soll. Habs auch schon mit der replace und replaceAll versucht. Aber das klappt auch net :-(
 
verwende notfalls eben einfache Befehle, Schleife über alle Strings, die Split erzeugt hat, mit charAt() erstes + letztes Zeichen anschauen, substring()..,
Grundbefehle beherrschen, nicht nur abgehobenen Kram wie split() benutzen
 
Mit charAt hab ich es auch schon versucht.

Java:
FileReader fr2 = new FileReader(file2);
				BufferedReader br2 = new BufferedReader(fr2);
				if (file2 != null && state2 == JFileChooser.APPROVE_OPTION)
			  	{
					String speicher = null;
					String ergebnis = null;
					while((speicher = br2.readLine()) != null)
					{
						for(int h = 0; h < speicher.length(); h++)
	            		{
	            			char character = speicher.charAt(h);
	            			String characterString = String.valueOf(character);
	            			if(characterString.equals("\""))
	            			{
	            				characterString = "";
	            			}	
	            			ergebnis = ergebnis + characterString;
	            		}
						rowData2 = speicher.split(";");
						Tab3.model.addRow(rowData2);
					}
			  	}
hat auch nüx gebracht 🙂

werd mir mal die substring methode mal anschauen.. 😳
 
die Schleife in Zeile 9-18 macht ja ne Menge, aber den String ergebnis verwendest du danach nicht..,
das Split geht auf den Originalstring speicher

falls du stattdessen ergebnis splitten willst achte darauf, dass du die vorherigen Zeilen rauslöschst,
der wird immer länger

einen char kannst du auch direkt auf [c]== '"'[/c] vergleichen, ohne Escape, ohne String-Umweg
 
So habs nach dann doch noch hinbekommen.
Falls es jemanden interessiert poste ich hier mal meine Lösung :

Java:
package Finanzen;
//
// Library Imports
import java.io.BufferedReader;
import java.io.File; 
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*; 
 
@SuppressWarnings("serial")
public class OpenDlg2 implements java.io.Serializable
{ 
	/*Filechooser zum anzeigen des Öffnen Dialogs. Über diese Klasse wird das Öffnen
	 * der abgespeicherten Datei angezeigt.
	 * 
	 */
	public OpenDlg2()
	{
	  	//
		// Blatt 3
		
		//
		// Das Dialogfenster als Filechooser definieren
		JFileChooser chooser2 = new JFileChooser(); 
		//
		// Den Filechooser als Öffnen-Dialogfeld definieren
	  	int state2 = chooser2.showOpenDialog(null);
	  	//
	  	// Die gewählte Datei in den Programmcode übertragen
	  	File file2 = chooser2.getSelectedFile();
	  	//
	  	// Ein String[] für die Daten angeben und initialisieren
	  	String[] rowData2 = null;
	  	//
		// Die Daten aus der Datei ins erste Tab übertragen
		try 
	  	{
			if (Tab3.table.getRowCount() != -1) 
			{
				//
				// Gesamte Tabelle Tab3 löschen
				for(int w=Tab3.table.getRowCount()-1;w>=0;w--) 
		    	{      
		    		Tab3.model.removeRow(w); 
		    	}
			}
			try
			{
				FileReader fr2 = new FileReader(file2);
				BufferedReader br2 = new BufferedReader(fr2);
				if (file2 != null && state2 == JFileChooser.APPROVE_OPTION)
			  	{
					String speicher = "";
					while((speicher = br2.readLine()) != null)
					{
						String ergebnis = "";
						System.out.println(speicher);
						for(int i = 0; i < speicher.length(); i++)
						{
							char zwischenSpeicher = speicher.charAt(i);
							if(zwischenSpeicher == '"')
							{
								
							}
							else
							{
								String zwischenString = String.valueOf(zwischenSpeicher);
								ergebnis = ergebnis + zwischenString;
							}
						}
						rowData2 = ergebnis.split(";");
						Tab3.model.addRow(rowData2);
					}
			  	}
			}
			catch(NullPointerException npe)
			{
				
			}
		} 
	  	catch (FileNotFoundException e) 
	  	{
	  		JOptionPane.showMessageDialog(null, "Error! File not opened!");
		} 
	  	catch (IOException e) 
		{
	  		JOptionPane.showMessageDialog(null, "Error! File not opened!");
		}
	}
}
 

Neue Themen


Zurück
Oben