Java Inhalt ausgeben

Status
Für weitere Antworten geschlossen.

siamak

Cadet 1st Year
Registriert
Mai 2013
Beiträge
13
hallo zusammen,

ich versuche seit 3 tagen diese Aufgabe zulösen:
Ich will aus einer TXT Datei den Inhalt auslesen dann spalten weise in eine anderen TXT Datei ausgeben.
z.B.

angenommen der Inhalt sei so:
*NODE
1, 8.673617380E-19, 5.000000000E-04, 1.000000000E-03
2, 1.734723476E-18, 1.000000000E-03, 1.000000000E-03
**

ich will das auslesen und dann so ausgeben:

1, 8.673617380E-19,
2, 1.734723476E-18,

1,5.000000000E-04,
2,1.000000000E-03,

1,1.000000000E-03
2,1.000000000E-03

Das auslesen und speichern habe ich wie folgt geschrieben :
Code:
ArrayList<String[]> list = new ArrayList<String[]>();
....
String zeile;
			while ((zeile = inFile.readLine()) != null) {
				if(zeile.startsWith("        ") ){
					String[] lineParts = zeile.split(",");
					list.add(lineParts);
					System.out.println(zeile);
				}}....

und aufgeben hab ich so gemacht:
Code:
public static void schreiben(ArrayList<String[]> list, String name){
		 try { 
	            PrintWriter printWriter = new PrintWriter(new FileWriter(name)); 
	            Iterator<String[]> iter = ((java.util.List<String[]>) list).iterator(); 
	            while(iter.hasNext() ) { 
	                Object o = iter.next(); 
	                //printWriter.println(o.toString()); 
	                lineParts.toString();
	            } 
	            printWriter.close(); 
	        } catch (IOException e) { 
	            e.printStackTrace(); 
	        } 
	 }

aber das funktioniert nicht kann einer mir sagen wo der Fehler ist bitte ???
THX
 
Hast du mal debuggt? Kommt ein Fehler, mit einer Beschreibung?
 
den iterator den du hin geschrieben hast ist meiner meinung nach mist.

richtig wäre wenn: Iterator<String[]> iter = list.iterator();
Und Object o ist auch schlecht. nimm stattdessen lieber String[] str=iter.next()

außerden würde ich statt einem iterator vll lieber direkt auf die elemente der spalten zugreifen
in pseudocode dann so:
i von 0 bis list[0].size()-1
j von 0 bis list.length-1
und dann die werte spalten weise auslesen mit: line[j]


PS wäre halt gut zu wissen was nicht funktioniert ;-)
 
Ne da kommt keine Fehlermeldung. Da passiert bloß nichts :(

Also ich rufe das ganze in der main so auf :
Code:
....
lesen();
String name;
		Date now = new Date();
		String dateTimeStr = now.toString();
		Scanner in = new Scanner(System.in);
		System.out.println("Dateinamen eingeben::  " );
		name = in.nextLine();
		in.close();
		creatFile("C:/Users/siamak/workspace/Converter", name, dateTimeStr);
		schreiben(list, name);

also ich will ja vorher noch eine TXT datei erstellen und dann in dieser speichern.
 
Ich glaube du hast das ganze konzeptionell etwas falsch angegangen.

Um einen neuen Node zu identifizieren hast du in der einzulesenden Datei den Indikator *NODE

Du kannst also mit
Code:
if(line.startsWith("*NODE"))
daruf reagieren und dir ein neues Objekt anlegen. Dafür würde ich eine Klasse MyNode schreiben, welche 3 Wertepaare (ArrayLists) als Parameter hat.

Da du in Java nur Zeilenweise einlesen kannst, splittest du die Zeilen jeweils am "," und beschreibst die jeweiligen Parameter deiner Klasse MyNode
Code:
String[] values = line.split(",");
node.getFirst.add(values[0]);
node.getSecond.add(values[1]);
node.getThird.add(values[2]);

Bei der Ausgabe nimmst du dann nur dein MyNode Objekt und greifst auf die jeweiligen Parameter zu.

Ich hoffe das war jetzt einigermaßen verständlich.
 
Zuletzt bearbeitet:
Also das Lesen Funktioniert aber richtig. also ich will "*NODE" undam ende "**" nicht speichenr und auch nicht ausgeben. nur die Zahlen wie ich oben geschrieben habe.

Und die Klsse MyNode hab ichnet ganz verstanden.


@honky-tonk: meinste 2 verschachtelte for schleifen ?????
 
genau die erste läuft über die spalten nummer und die zweite über die zeilen wenn man sich ein konstrukt wie deine eingabe datei anschaut

ansonsten vll auch mal eine println einfügen damit du siehst was er grad macht ;-)
 
Ich habs mal fix zusammengeschrieben. Ist optimaler, als mit verschachtelten Schleifen zu arbeiten.

Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class NodeReader {

    public static void main(String[] args) {
        File fileIn = new File("C:/Temp/fileIn.txt");
        File fileOut = new File("C:/Temp/fileOut.txt");

        List<MyNode> nodeList = new ArrayList<MyNode>();

        try {
            if (!fileOut.exists()) {
                fileOut.createNewFile();
            }

            BufferedReader br = new BufferedReader(new FileReader(fileIn));

            String line = "";

            MyNode node = null;
            while ((line = br.readLine()) != null) {
                if (!line.trim().isEmpty()) {
                    if (line.contains("*NODE")) {
                        node = new MyNode();
                    } else if (line.contains(",")) {
                        String[] parts = line.split(",");
                        node.getFirst().add(parts[1]);
                        node.getSecond().add(parts[2]);
                        node.getThird().add(parts[3]);
                    } else if (line.contains("**")) {
                        nodeList.add(node);
                    }
                }
            }

            br.close();

            if (!nodeList.isEmpty()) {
                BufferedWriter bw = new BufferedWriter(new FileWriter(fileOut));

                for (MyNode nodeIn : nodeList) {
                    bw.write("new Node\n");
                    bw.write("1, " + nodeIn.getFirst().get(0) + "\n");
                    bw.write("2, " + nodeIn.getFirst().get(1) + "\n");
                    bw.write("\n");
                    bw.write("1, " + nodeIn.getSecond().get(0) + "\n");
                    bw.write("2, " + nodeIn.getSecond().get(1) + "\n");
                    bw.write("\n");
                    bw.write("1, " + nodeIn.getThird().get(0) + "\n");
                    bw.write("2, " + nodeIn.getThird().get(1) + "\n");

                    bw.flush();
                }

                bw.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("done");
    }

}

Und die MyNode Klasse

Code:
import java.util.ArrayList;
import java.util.List;

public class MyNode {
    private List<String> first = new ArrayList<String>();
    private List<String> second = new ArrayList<String>();
    private List<String> third = new ArrayList<String>();

    public MyNode() {
    }

    public List<String> getFirst() {
        return first;
    }

    public void setFirst(List<String> first) {
        this.first = first;
    }

    public List<String> getSecond() {
        return second;
    }

    public void setSecond(List<String> second) {
        this.second = second;
    }

    public List<String> getThird() {
        return third;
    }

    public void setThird(List<String> third) {
        this.third = third;
    }

}

Bei diesem Input:
*NODE
1, 8.673617380E-19, 5.000000000E-04, 1.000000000E-03
2, 1.734723476E-18, 1.000000000E-03, 1.000000000E-03
**

*NODE
1, 2.673617380E-19, 4.000000000E-04, 6.000000000E-03
2, 3.734723476E-18, 5.000000000E-03, 7.000000000E-03
**

bekomme ich diesen Output:
new Node
1, 8.673617380E-19
2, 1.734723476E-18

1, 5.000000000E-04
2, 1.000000000E-03

1, 1.000000000E-03
2, 1.000000000E-03
new Node
1, 2.673617380E-19
2, 3.734723476E-18

1, 4.000000000E-04
2, 5.000000000E-03

1, 6.000000000E-03
2, 7.000000000E-03


Das Ganze ist jetzt sehr spezifisch, ohne das auf alle Eventualitäten eingegangen wird. Es ist auf jeden Fall noch Optimierungspotential vorhanden.
 
Zuletzt bearbeitet:
Das stimmt das ist sehr spezifische, aber trotzdem danke. Ich krieg eine NPE und zwar hier :
Exception in thread "main" java.lang.NullPointerException
at DateiLesen.NodeReader.main(NodeReader.java:36)
Code:
node.getFirst().add(parts[1]);
 
Sieht deine Eingangsdatei genauso aus wie meine?

Dein node scheint null zu sein. Vermutlich kam also keine Zeile mit *NODE, bevor du Werte reinschreiben wolltest.
 
Also die EIngabe datei sieht natürlich anderes aus. das war nur ein BSP :)...
aber es funktioniert. das problem ist in OutFile datei kommen die Daten alle in einer Reihe.
und nicht unter einandern ....
 
Wie gesagt, ist der Quellcode für deine Beispieleingabe.

Wenn die Umbrüche fehlen wurden scheinbar die "\n" in den write()-Anweisungen (ll. 50-58) beim Kopieren verworfen. Prüfe das nochmal.
 
also wenn ich das fenster so klein mache, dann sind die in gleicher Reihnfolge. aber das ist nicht der Sinn und ich will das auch nicht so haben. :(
 
Bitte lies, was ich geschrieben habe. Poste bitte mal deinen Quellcode.
 
So sieht eigentlich meine eingabe datei aus. und es kann auch sein dass da manchmal mehr als 27 zeilen ist. Und es gibt auch davor und danach noch mehr zeilen. aber ich willen exact diesen Abschnit speichern und dann ausgeben.
Code:
*Part, name=PART-1
*NODE
         1,  8.673617380E-19,  5.000000000E-04,  1.000000000E-03
         2,  1.734723476E-18,  1.000000000E-03,  1.000000000E-03
         3,  1.734723476E-18,  1.000000000E-03,  5.000000000E-04
         4,  8.138759211E-19,  5.000000000E-04,  5.000000000E-04
         5,  0.0            ,  0.0            ,  5.000000000E-04
         6,  0.0            ,  0.0            ,  1.000000000E-03
         7,  5.000000000E-04,  0.0            ,  0.0            
         8,  0.0            ,  0.0            ,  0.0            
         9,  8.673617380E-19,  5.000000000E-04,  0.0            
        10,  5.000000000E-04,  5.000000000E-04,  0.0            
        11,  1.734723476E-18,  1.000000000E-03,  0.0            
        12,  5.000000000E-04,  0.0            ,  1.000000000E-03
        13,  5.000000000E-04,  0.0            ,  5.000000000E-04
        14,  1.000000000E-03,  0.0            ,  5.000000000E-04
        15,  1.000000000E-03,  0.0            ,  1.000000000E-03
        16,  1.000000000E-03,  5.000000000E-04,  1.000000000E-03
        17,  1.000000000E-03,  5.000000000E-04,  5.000000000E-04
        18,  5.000000000E-04,  1.000000000E-03,  1.000000000E-03
        19,  5.000000000E-04,  1.000000000E-03,  5.000000000E-04
        20,  1.000000000E-03,  1.000000000E-03,  5.000000000E-04
        21,  1.000000000E-03,  1.000000000E-03,  1.000000000E-03
        22,  5.000000000E-04,  1.000000000E-03,  0.0            
        23,  1.000000000E-03,  5.000000000E-04,  0.0            
        24,  1.000000000E-03,  0.0            ,  0.0            
        25,  1.000000000E-03,  1.000000000E-03,  0.0            
        26,  5.000000000E-04,  5.000000000E-04,  1.000000000E-03
        27,  5.000000000E-04,  5.000000000E-04,  5.000000000E-04
**
*ELEMENT, TYPE=C3D8, Elset=mold
 
Den Fehler mit der NPE findest du alleine, wenn du dir den Code in der entsprechenden Zeile und die ersten drei Zeilen deiner Eingangsdatei anschaust.

Da deine Eingangsdatei jetzt aber komplett anders aussieht als dein Beispiel, ist der von mir geschriebene Code hinfällig.
Du kannst weiterhin mit 3 Listen arbeiten, muss abr solange über die Zeilen iterieren bis der Node fertig eingelesen ist, anstatt nur die ersten beiden Zeilen zu nehmen.

Bzw. musst du nur die Zeilen 50 bis 60 überarbeiten.

Als kleine Hilfestellung kannst du dir ja vor dem Schreiben mal das Objekt nodeList ausgeben lassen oder einfach reindebuggen.
 
Zuletzt bearbeitet:
Also das lesen so wie ich das hatte hat sehr gut funktioniert. aber das speichern und aufspliten nicht so ganz. Und da meine Eingabedatei schon vor her "," beinhaltet, krige ich eine NPE ??!
 
Was passiert hier:
Code:
if (line.contains("*NODE")) {
                        node = new MyNode();
                    } else if (line.contains(",")) {
                        String[] parts = line.split(",");
                        node.getFirst().add(parts[1]);
                        node.getSecond().add(parts[2]);
                        node.getThird().add(parts[3]);
                    } else if (line.contains("**")) {
                        nodeList.add(node);
                    }

Wenn dieser Code prozessiert wird:
*Part, name=PART-1
*NODE
1, 8.673617380E-19, 5.000000000E-04, 1.000000000E-03


Er versucht Zeile 1 am "," zu splitten und in des Objekt node zu schreiben, welches aber noch nicht existiert, weil keine Zeile *NODE vorausgegangen ist.

Also musst du die Bedingung für das schreiben erweitern (erster else if Zweig)
 
Ich dachte das arbeitet wie folgt. es guckt sobald *NODE vor kommt dann fängt an zu lesen. also die zeilen davor interessieren uns nict. und endet sobald ** vorkommt.

Deswegen dachte ich ich kann das so machen:
Code:
while ((zeile = inFile.readLine()) != null) {
				if(zeile.startsWith("        ") ){
					String[] Parts = zeile.split(",");
					node.getFirst().add(parts[1]);
	                                node.getSecond().add(parts[2]);
	                                node.getThird().add(parts[3]);
				}
				if(zeile.startsWith("*E")){
					break;
				}

oder ???
 
Dann instanziierst du dir aber nirgends das node Objekt.

Wenn du die erste else if Bedingung auf
Code:
} else if (line.contains(",") && !line.contains("*")) {

änderst reicht das locker aus. Und ein startsWith(" ") halte ich für bedenklich. Sobald eine Zeile nen Leerzeichen mehr oder weniger hat, wird sie ausgelassen.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben