printf Daten aus der Tabelle in Excel übernehmen

timi042

Neues Mitglied
Liebe Community,

ich arbeite an einem Program das die Aufladung eines Kondensators berechnet und mir die Daten die ich über printf in einer Tabelle ausgeben möchte in eine CSV Datei schreibt damit ich später in Excel ein Diagramm erstellen kann dass mir die Aufladung in einem Diagramm zeigt. Die Achsen sollen mit Spannung (U) und Zeit (t) beschriftet sein.
Bitte beachtet ich bin Anfänger 🙂

Hier mein code:
Java:
import jxl.*;
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.text.BreakIterator;
import java.util.Date;
import jxl.*;
import jxl.write.*;
import jxl.write.Boolean;
import jxl.write.Number;
import jxl.write.biff.RowsExceededException;
import java.util.*;
public class KondensatorAufladung {
  
    public static void main(String[] args) {
      
  
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Gib U ein: "+"\n");
        double u = Integer.parseInt(br.readLine());
        System.out.print("Gib I ein: \n");
        double i = Integer.parseInt(br.readLine());
        System.out.print("Gib R (Vorwiederstand) ein: \n");
        double r = Integer.parseInt(br.readLine());
        System.out.print("Gib t (in ms) ein: \n");
        double t = Integer.parseInt(br.readLine());
      
        //Hier wird gerechnet
        double q = i*t;
        double c = q/u;
        double zk = r*c; //zk ist die Zeitkonstante(T)
      
      
        //System.out.printf("%.2f",t);
        System.out.printf("%10s    |%10s %n", "Tabelle", "Zeit (t)");
        System.out.println("------------------------------" );
        //System.out.printf("%10.2f    |%10.2f    |%10.2f    |%10.2f %n" , 1.768, 22.777, 333.8888, 4444.777654);
        //System.out.printf("%10.2f    |%10.2f    |%10.2f    |%10.2f %n" , 12.999, 123.875478, 124.46, 125345.5463728);
      
        float q_2 = (float) q;
        float i_start=-10;
        //float t_start=-1;
        float u_start=-10;
      
      
        for (int a=0; a<=(u/10); a++){
          
          
            u_start=u_start+10;
            i_start=i_start+10;
            float t_stelle=q_2/i_start;
            //t_start=t_start+1;
            //String i_string = String.valueOf(i_start);
            //String t_string = String.valueOf(t_start);
            System.out.printf("%10.2f    |%10.2f%n" , u_start, t_stelle);
          
          
          
          
          
        }
      
      
      
      
      
      
      
            File exlFile = new File("h:/test_excel.xls");
            WritableWorkbook writableWorkbook = Workbook.createWorkbook(exlFile);
          
         
            WritableSheet writableSheet = writableWorkbook.createSheet("Kondensator Aufladung", 0);
            Label ueberschrift1_label = new Label(0,0, "Werte für U:");
            Label u_label = new Label(0, 1, String.valueOf(u));
            Label ueberschrift2_label = new Label(1,0, "Werte für Q:");
            Label q_label = new Label(1,1, String.valueOf(q));
            Label ueberschrift3_label = new Label(2,0, "Berechnete Werte für Kapazität (C):");
            Label c_label = new Label(2,1, String.valueOf(c));
            Label ueberschrift4_label = new Label(0,3, "Wert für I:");
            Label i_label = new Label(0,4, String.valueOf(i));
            Label ueberschrift5_label = new Label(1,3, "Wert für t:");
            Label t_label = new Label(1,4, String.valueOf(t));
          
            //Add the created Cells to the sheet
            writableSheet.addCell(u_label);
            writableSheet.addCell(q_label);
            writableSheet.addCell(c_label);
            writableSheet.addCell(i_label);
            writableSheet.addCell(t_label);
            writableSheet.addCell(ueberschrift1_label);
            writableSheet.addCell(ueberschrift2_label);
            writableSheet.addCell(ueberschrift3_label);
            writableSheet.addCell(ueberschrift4_label);
            writableSheet.addCell(ueberschrift5_label);
          
            //Write and close the workbook
            writableWorkbook.write();
            writableWorkbook.close();
          
          
          
            FileWriter csv_datei = new FileWriter("h:/testfile.csv");
            csv_datei.append(String.valueOf(u));
            csv_datei.append('\n');
            csv_datei.append(String.valueOf(q));
            csv_datei.append("\n");
            csv_datei.append(String.valueOf(c));
            csv_datei.append("\n");
            csv_datei.append(String.valueOf(i));
            csv_datei.append("\n");
            csv_datei.append(String.valueOf(t));
            csv_datei.append("\n");
          
            csv_datei.flush();
            csv_datei.close();
          
        } catch (IOException e) {
            e.printStackTrace();
        } catch (RowsExceededException e) {
            e.printStackTrace();
        } catch (WriteException e) {
            e.printStackTrace();
        }
    }
}

Edit:
Verbesserungsvorschläge höre ich gerne 🙂
 
Hey, bin mir noch nicht sicher was du von der Community hören willst. Jeder Code kann immer verbessert werden.

Ich sehe folgende Punkte:
  1. Was ist, wenn der Nutzer einen Buchstaben anstatt eine Zahl für U, I, etc. eingibt ?
  2. Man könnte dein Programm in Methoden aufteilen. Zum Beispiel Lese Eingabe Werte, berechne Werte, schreibe xls oder CSV.
  3. Die Output Files sind hard gecoded , immer schlecht.
  4. Man könnte Klassen einführen um besser zu Kapseln.
  5. Tests zum prüfen ob dein Code korrekt ist.
Hoffe das trifft deine Erwartungen für deine Frage...
 
Meine Frage ist wie ich eine Tabelle die ich über printf auf der Console ausgebe in eine csv Datei schreiben kann so das ich aus den errechneten Werten ein Diagramm zeichenen kann in Excel 🙂
 
Okay, also die Frage war wohl, wie kann man den Code verbessern 😉

Also Regel Nummer 1 im Code Club lautet: Dont repeat yourself.
Wie mein dayafterreh schon anmerkte solltest du für sowas code in Methoden auslagern.

Java ist eine objektorientierte Programmiersprache, dein vorgehen ist eher prozedural.
Objektorientiert heißt das du versuchst Dinge aus der Realität in die virtuelle Welt zu überführen.

In der Realität würde man wahrscheinlich ein Messgerät nehmen und Werte messen und die in eine Liste eintragen. --> Objektorientiert würde man dann Objekte (Klassen) anlegen, eine Klasse Messgerät, welches man auf die gewünschte Einheit umstellen kann. Und vielleicht noch eine Liste mit Messwerten.

Aber das wäre wohl mit Kanonen auf Spatzen geschossen.

Du müsstest eine Instanz deines KondensatorAufladung Objekt in der main() Methode erstellen.
Dann kannst du deinem Objekt ein paar Methoden spendieren, z.B:

Java:
public class KondensatorAufladung {

    private double i, u, r, t, q, c, zk;

    public static void main(String[] args) {
        KondenstatorAufladung kondenstator = new KondenstatorAufladung();
    }

    public KondensatorAufladung() {
        leseWerteEin();
        rechne();
        // usw.
    }

    private double leseWert(String text, BufferedReader br) {
        System.out.println(String.format("Gib %s ein:", text));
      
        try {
            return Double.parseDouble(br.readLine());
        } catch (IOException e) {
            // Fehlerbehandlung bei Einlesen
        }
      
        throw new NumberFormatException();
    }
  
    private void leseWerteEin() {
        try(InputStreamReader in = new InputStreamReader(System.in)) {
            BufferedReader br = new BufferedReader(in);
          
            u = leseWert("U", br);
            i = leseWert("I", br);
            r = leseWert("R (Vorwiederstand)", br);
            t = leseWert("t (in ms)", br);
    
        } catch (IOException e) {
            // Fehlerbehandlung bei Einlesen
        }

    private void rechne() {
            q = i * t;
            c = q / u;
            zk = r * c; // zk ist die Zeitkonstante(T)
    }
}

Edit: Okay jetzt war die konkrete Frage da^^
Also in einer Csv Datei sind die einzelnen Spalten mit ";" getrennt und die Zeilen durch ein Zeilenumbruch "\n"

Das heißt du musst nur dafür sorgen das deine einzelnen Werte mit einem ";" voneinander getrennt und mit "\n" am Ende jeder Zeile in eine Textdatei mit der Endung .csv gespeichert werden.
 
Moin,

BTW:
ich arbeite an einem Program das die Aufladung eines Kondensators berechnet und mir die Daten die ich über printf in einer Tabelle ausgeben möchte in eine CSV Datei schreibt damit ich später in Excel ein Diagramm erstellen kann dass mir die Aufladung in einem Diagramm zeigt.
ist Deine 'Komma'-Taste kaputt??
Muss man ja mindestens dreimal lesen, den Satz .... 🙁

Gruß Klaus
 

Zurück
Oben