unerklärliche Fragezeichen vor jedem Datensatz

seven

Grünschnabel
Hallo an alle Helfer,

ich arbeite mit Windows xp Prof. und schreibe meine Programme mit Eclipse, jdk 1.6.0_14 und als lib die RXTX.jar, dass nur mal zu den Gegebenheiten.

Ich habe ein Progrämmchen zum Erfassen der Daten aus einer TK-Anlage. Es funktioniert soweit ganz gut, nur das beim zweiten Mal des Erfassens viele Fragezeichen vor dem 2. und nachfolgenden Datensätzen stehen. Ich habe mir schon alle Daten während des Betriebes ausgeben lassen, wo dieses Fragezeichen auch dabei war. Dann bin ich "Step by Step" mit Eclipse durchgegangen und da kamen keine Fragezeichen.
Ich habe auch schon versucht die Fragezeichen mit Leerzeichen zu ersetzen und danach mit trim() die Leerzeichen zu beseiten. Wäre aber auch nicht die optimale Lösung. Die Anzahl der Fragezeichen ist auch immer unterschiedlich. Ich kann mir das jetzt nicht erklären. :confused:

Hier ein Beispiel der Ausgabe:
Die viele Fragezeichen werden komischerweise rausgenohmen, aber es stehen wirklich viele Fragezeichen ab dem 2. Datensatz davor.
Code:
09.10.2009	11:45	00:04:19	11	IB100	09	###########	0.000		
?09.10.09	11:38	00:15:25	50	IB2	09	###########	0.000

Hier der Java-Code:

Code:
public void serialEvent(SerialPortEvent event) {
		switch (event.getEventType()) {
		case SerialPortEvent.BI:
		case SerialPortEvent.OE:
		case SerialPortEvent.FE:
		case SerialPortEvent.PE:
		case SerialPortEvent.CD:
		case SerialPortEvent.CTS:
		case SerialPortEvent.DSR:
		case SerialPortEvent.RI:
		case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
			break;
		case SerialPortEvent.DATA_AVAILABLE:
			// byte[] readBuffer = new byte[20];

			ReadIni pathToOutputfile = null;
			try {
				pathToOutputfile = new ReadIni();
			} catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			String pfad = null;
			try {
				pfad = pathToOutputfile.getPathToOutput();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			StringBuffer strBuffer = new StringBuffer();
			File inBW = new File(pfad);

			int c = 0;

			try {
				while ((c = inputStream.read()) != 10) { // 10 - Newline LN
					if (c != 13) // 13 - carriage return
						if (c != 63) // 63 - ? (Fragezeichen)
						strBuffer.append((char) c);
				}
				String aaa = strBuffer.append((char) c).toString();
				
				String scannedInput = strBuffer.toString();

				StringTokenizer st = new StringTokenizer(scannedInput);
				String token = "";
				int i = 0;
                                
                                // Deklaration und Initialisierung
				String datum1 = "";
				....

				ReadIni tkAnlage = new ReadIni();
				char tkHersteller = tkAnlage.getTKHersteller();
				String zeitS = "";
				String dauerRufnr = "";
				
				Calendar cal = Calendar.getInstance();
				cal.setTime(new Date()); //heute
				int jahr = cal.get(Calendar.YEAR);
		
				while (st.hasMoreTokens()) {
					token = st.nextToken().trim();
					i++;

					switch (tkHersteller) {
					
					case 'E':
						if (i == 1) {
							datum1 = token;
							datum2 = datum1.replace("/", ".");
							tag_monat = datum2.substring(0, 6);
							jahr2 = datum2.substring(6);
					
							if (jahr2.length() <= 2) {
								datum4 = tag_monat + jahr;
							} else {
								datum4 = datum2;
							}
						}

						if (i == 2) {
							zeit = token;
						}

						if (i == 3) {
							dauer = token;
						}

						if (i == 4) {
							internNr = token;
						}

						if (i == 5) {
							in_out = token;
						}

						if (i == 6) {
							nobody = token;
						}

						if (i == 7) {
							telefonNr = token;
						}

						if (i == 8) {
							preis = token;
						}

						if (i == 9) {
							waehrung = token;
						}

						break;
						
					case 'S':
						String leitung = "";

						if (i == 1) {
							datum1 = token;
							datum2 = datum1.substring(0, 8);
							zeitS = datum1.substring(8, 16);
							tag_monat = datum2.substring(0, 6);
							jahr2 = datum2.substring(6);
							if (jahr2.length() <= 2) {
								datum4 = tag_monat + jahr;
							} else {
								datum4 = datum2;
							}
						}

						// if (i == 2) {
						zeit = zeitS;
						// }

						if (i == 3) {
							leitung = token;
						}

						if (i == 4) {
							internNr = token;
						}

						if (i == 5) {
							dauerRufnr = token;
							int maxlenght = dauerRufnr.length();
							dauer = dauerRufnr.substring(0, 8);
							telefonNr = dauerRufnr.substring(8, maxlenght);
						}
						break;

					default:
						break;
					}
				}

                                // Daten aus INI-Datei
				ReadIni date = new ReadIni();
				String wert_1 = date.getDatum();
				...

				String[] datentk = { datum4, zeit, dauer, internNr, in_out,
						nobody, telefonNr, preis, waehrung };

				String[] arr = { wert_1, wert_2, wert_3, wert_4, wert_5,
						wert_6, wert_7, wert_8, wert_9 };

				SortedMap<String, String> sm = new TreeMap<String, String>();
				for (int j = 0; j < datentk.length; j++) {
					sm.put(arr[j], datentk[j]);
				}

				String ausgabe = "";

				for (String key : sm.keySet()) {
					//System.out.printf("%s \t", sm.get(key));
					ausgabe += sm.get(key) + "\t";
				}

				FileWriter ausgabeFW = new FileWriter(inBW, true);
				ausgabeFW.write(ausgabe + "\r\n");
				ausgabeFW.close();
			} catch (IOException e) {
                         ...

So, jetzt zu meine Fragen:
Woher kommen die Fragezeichen?
Warum werden sie vor jedem Datensatz gesetzt und das erst bei dem zweiten und nicht schon beim ersten Datensatz?
Wie kann ich dieses Problem beseitigen.

Für jede Hilfe bin ich dankbar.

Gruß seven.
 
Hallo an alle Helfer,

ich arbeite mit Windows xp Prof. und schreibe meine Programme mit Eclipse, jdk 1.6.0_14 und als lib die RXTX.jar, dass nur mal zu den Gegebenheiten.

Ich habe ein Progrämmchen zum Erfassen der Daten aus einer TK-Anlage. Es funktioniert soweit ganz gut, nur das beim zweiten Mal des Erfassens viele Fragezeichen vor dem 2. und nachfolgenden Datensätzen stehen. Ich habe mir schon alle Daten während des Betriebes ausgeben lassen, wo dieses Fragezeichen auch dabei war. Dann bin ich "Step by Step" mit Eclipse durchgegangen und da kamen keine Fragezeichen.
Ich habe auch schon versucht die Fragezeichen mit Leerzeichen zu ersetzen und danach mit trim() die Leerzeichen zu beseiten. Wäre aber auch nicht die optimale Lösung. Die Anzahl der Fragezeichen ist auch immer unterschiedlich. Ich kann mir das jetzt nicht erklären. :confused:

Hier ein Beispiel der Ausgabe:
Die viele Fragezeichen werden komischerweise rausgenohmen, aber es stehen wirklich viele Fragezeichen ab dem 2. Datensatz davor.
Code:
09.10.2009	11:45	00:04:19	11	IB100	09	###########	0.000		
?09.10.09	11:38	00:15:25	50	IB2	09	###########	0.000

Hier der Java-Code:

Code:
public void serialEvent(SerialPortEvent event) {
		switch (event.getEventType()) {
		case SerialPortEvent.BI:
		case SerialPortEvent.OE:
		case SerialPortEvent.FE:
		case SerialPortEvent.PE:
		case SerialPortEvent.CD:
		case SerialPortEvent.CTS:
		case SerialPortEvent.DSR:
		case SerialPortEvent.RI:
		case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
			break;
		case SerialPortEvent.DATA_AVAILABLE:
			// byte[] readBuffer = new byte[20];

			ReadIni pathToOutputfile = null;
			try {
				pathToOutputfile = new ReadIni();
			} catch (IOException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
			String pfad = null;
			try {
				pfad = pathToOutputfile.getPathToOutput();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			StringBuffer strBuffer = new StringBuffer();
			File inBW = new File(pfad);

			int c = 0;

			try {
				while ((c = inputStream.read()) != 10) { // 10 - Newline LN
					if (c != 13) // 13 - carriage return
						if (c != 63) // 63 - ? (Fragezeichen)
						strBuffer.append((char) c);
				}
				String aaa = strBuffer.append((char) c).toString();
				
				String scannedInput = strBuffer.toString();

				StringTokenizer st = new StringTokenizer(scannedInput);
				String token = "";
				int i = 0;
                                
                                // Deklaration und Initialisierung
				String datum1 = "";
				....

				ReadIni tkAnlage = new ReadIni();
				char tkHersteller = tkAnlage.getTKHersteller();
				String zeitS = "";
				String dauerRufnr = "";
				
				Calendar cal = Calendar.getInstance();
				cal.setTime(new Date()); //heute
				int jahr = cal.get(Calendar.YEAR);
		
				while (st.hasMoreTokens()) {
					token = st.nextToken().trim();
					i++;

					switch (tkHersteller) {
					
					case 'E':
						if (i == 1) {
							datum1 = token;
							datum2 = datum1.replace("/", ".");
							tag_monat = datum2.substring(0, 6);
							jahr2 = datum2.substring(6);
					
							if (jahr2.length() <= 2) {
								datum4 = tag_monat + jahr;
							} else {
								datum4 = datum2;
							}
						}

						if (i == 2) {
							zeit = token;
						}

						if (i == 3) {
							dauer = token;
						}

						if (i == 4) {
							internNr = token;
						}

						if (i == 5) {
							in_out = token;
						}

						if (i == 6) {
							nobody = token;
						}

						if (i == 7) {
							telefonNr = token;
						}

						if (i == 8) {
							preis = token;
						}

						if (i == 9) {
							waehrung = token;
						}

						break;
						
					case 'S':
						String leitung = "";

						if (i == 1) {
							datum1 = token;
							datum2 = datum1.substring(0, 8);
							zeitS = datum1.substring(8, 16);
							tag_monat = datum2.substring(0, 6);
							jahr2 = datum2.substring(6);
							if (jahr2.length() <= 2) {
								datum4 = tag_monat + jahr;
							} else {
								datum4 = datum2;
							}
						}

						// if (i == 2) {
						zeit = zeitS;
						// }

						if (i == 3) {
							leitung = token;
						}

						if (i == 4) {
							internNr = token;
						}

						if (i == 5) {
							dauerRufnr = token;
							int maxlenght = dauerRufnr.length();
							dauer = dauerRufnr.substring(0, 8);
							telefonNr = dauerRufnr.substring(8, maxlenght);
						}
						break;

					default:
						break;
					}
				}

                                // Daten aus INI-Datei
				ReadIni date = new ReadIni();
				String wert_1 = date.getDatum();
				...

				String[] datentk = { datum4, zeit, dauer, internNr, in_out,
						nobody, telefonNr, preis, waehrung };

				String[] arr = { wert_1, wert_2, wert_3, wert_4, wert_5,
						wert_6, wert_7, wert_8, wert_9 };

				SortedMap<String, String> sm = new TreeMap<String, String>();
				for (int j = 0; j < datentk.length; j++) {
					sm.put(arr[j], datentk[j]);
				}

				String ausgabe = "";

				for (String key : sm.keySet()) {
					//System.out.printf("%s \t", sm.get(key));
					ausgabe += sm.get(key) + "\t";
				}

				FileWriter ausgabeFW = new FileWriter(inBW, true);
				ausgabeFW.write(ausgabe + "\r\n");
				ausgabeFW.close();
			} catch (IOException e) {
                         ...

So, jetzt zu meine Fragen:
Woher kommen die Fragezeichen?
Warum werden sie vor jedem Datensatz gesetzt und das erst bei dem zweiten und nicht schon beim ersten Datensatz?
Wie kann ich dieses Problem beseitigen.

Für jede Hilfe bin ich dankbar.

Gruß seven.

Huhu, Fragezeichen erscheinen wenn das aktuelle Charset kein Zeichen kennt.

Schon mal darüber nachgedacht, dass das Encoding des Inputs nicht mit dem der Java VM übereinstimmt?. Bin bis jetzt immer wieder bei Linux darauf gestoßen.
Mein Linux-maschine schluckt aus einer Windows Text Datei alle Umlaute und ersetzt die mit Fragezeichen '?'.

Es hat Monate gebraucht bis ich rausfand, dass meine VM unter Linux mit dem US-ASCII charset läuft.

Ich würd an deiner Stelle in diese Richtung ermitteln.

Btw, der Code wird richtig eingefärbt wenn du [ code=java ] -tags statt den [ code ] tags benutzt.

Grüße,
Filip
 

Neue Beiträge

Zurück