CSV Eintrag der nächsten Zeile auslesen funktioniert nicht

StefanF195

Mitglied
Hallo liebe Java Gemeinde,
ich habe eine CSV Datei mit folgendem Aufbau:
CASE; BELNR; ACTNAME; RESOURCE;
10000_0;100002350; FB01 ; STEINER;
10000_0;100002357; VF01 ; UHLE;
10001_0;1400000768; FBZ1 ; UHLE;
10001_0;100002357; FB01 ; STEINER;

Was ich nun vor habe ist folgendes: Ich möchte in der Ersten Zeile den Case und den Namen auslesen und in einer Variable speichern.
Das ganze mache ich auch für die zweite Zeile. Wenn nun der Case aus Zeile 1 gleich dem Case aus Zeile 2 ist, soll er die beiden Namen ausgeben.
Irgendwie funktioniert das ganze aber nicht, ich bekomme immer sowas raus: STEINER; STEINER:
Es scheint als würde er zwischen den Zuweisungen zu Name1,Case1 und Name2, Case2 nicht in die nächste Zeile springen?!
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.*;

public class MapPerson {
	 
	public static void main(String[] args) throws FileNotFoundException {
		 
			MapPerson obj = new MapPerson();
			obj.run();
		 
		  }
	
	 public void run() throws FileNotFoundException {
	//	 	System.setOut(new PrintStream(new File("edges1.csv")));
			String csvFile = "D://Users/Stefan/workspace/Filterperson6/src/gefiltertfuertest1.csv";
			BufferedReader br = null;
			String line ="";
			String lastline=null;
			String cvsSplitBy = ";";
		 
			try {
		 
		//		Map<String, String> maps = new HashMap<String, String>();
		 
				br = new BufferedReader(new FileReader(csvFile));
				br.readLine();
				while ((line = br.readLine()) != null) 
				{
					
					
					// use semicolon as separator
					String[] Name = line.split(cvsSplitBy);
					line=lastline;
					String Name1 = Name[3];
					String Case1 = Name[0];
					br.readLine();
					String Name2 = Name[3];
					String Case2 = Name[0];
					
					If (Case1.equals(Case2));
					{
					System.out.println(Name1 + ";" + Name2 +":");
					}
					line=lastline;
					
					
					
			//		maps.put(Name[3],Name[0] );
		
				}
		 
				//loop map
			//	System.out.println("ID;");
			//	for (Map.Entry<String, String> entry : maps.entrySet()) {
					
				
					
			//		System.out.println(entry.getKey() + ";")
			//			;
				//+ entry.getValue())
					   
			//	}
		 
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (br != null) {
					try {
						br.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		 
		//	System.out.println("Done");
		  }

	private void If(boolean equals) {
		// TODO Auto-generated method stub
		
	}
}
Warum funktioniert das nicht?
Fehlermeldungen gibt es keine.
Vielen Dank im Voraus
 

Flown

Administrator
Mitarbeiter
Du lest immer zwei Zeilen gleichzeitig aus, das heißt nur Zeilen 1 und 2, 3 und 4, usw. werden verglichen, aber nicht 2 und 3 usw.

Vielleicht hilft dir das ein wenig weiter:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;

public class Test {
  public static void main(String... args) {
    String csv = "CASE; BELNR; ACTNAME; RESOURCE;\n10000_0;100002350; FB01 ; STEINER;\n10000_0;100002357; VF01 ; UHLE;\n10001_0;1400000768; FBZ1 ; UHLE;\n10001_0;100002357; FB01 ; STEINER;";
    printPersons(csv);
  }
  
  public static void printPersons(String csv) {
    try (BufferedReader br = new BufferedReader(new StringReader(csv))) {
      String line, lastCase = null, lastName = null;
      for (int i = 0; (line = br.readLine()) != null; i++) {
        String[] split = line.split(";");
        String curCase = split[0];
        String curName = split[3];
        if (i != 0) {
          if (lastCase.equals(curCase)) {
            System.out.println(lastName + " -> " + curName);
          }
        }
        lastCase = curCase;
        lastName = curName;
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
 

StefanF195

Mitglied
Hallo Flown,
vielen vielen Dank für deine Antwort, du bist meine Rettung.
Ich hänge allerdings an noch einer Sache. Ich möchte nun nicht mehr die Zeilen nacheinander vergleichen, sondern einen überspringen. D.h ich möchte 1und3, 2und4, 3und5 usw miteinander vergleichen.
Also das gleiche wie oben nur mit einem Sprung dazwischen.
Java:
try {
				
		 
		//		Map<String, String> maps = new HashMap<String, String>();
		 
				br = new BufferedReader(new FileReader(csvFile));
				br.readLine();
				String line; String lastCase = null; String lastName =null;
				String lastName2=null;String lastCase2 = null;
				for (int i = 0; (line = br.readLine()) != null; i++) 
					{
					 	String[] split = line.split(";");
				        String curCase = split[0];
				        String curName = split[3];
				        if (i > 1) {
				        	
					          if (lastCase2.equals(curCase)) 
					          	{
					        	  System.out.println(lastName2 + ";" + curName);
					          	}
					}
				        if(i==0)
				        {
				           lastName2=curName;
				           lastCase2=curCase;
				        }
				        if(i==1)
				        {
				        	lastCase = curCase;
					        lastName = curName;
				        }
				        if(i>1)
				        {
				        lastCase2 = lastCase;
				        lastName2 = lastName;
				        }
				}
		    }

ich glaube ich mache es mir ein wenig kompliziert, deshalb sehe ich den Fehler nicht ^^
Ich würde mich sehr freuen, wenn du mir noch einmal helfen könntest.

lieben Gruß

Stefan
 

Harry Kane

Top Contributor
Hi, ich habe ein paar verdächtige Stellen im Code kommentiert.
ich habe eine CSV Datei mit folgendem Aufbau:
CASE; BELNR; ACTNAME; RESOURCE;
10000_0;100002350; FB01 ; STEINER;
10000_0;100002357; VF01 ; UHLE;
10001_0;1400000768; FBZ1 ; UHLE;
10001_0;100002357; FB01 ; STEINER;

Was ich nun vor habe ist folgendes: Ich möchte in der Ersten Zeile den Case und den Namen auslesen und in einer Variable speichern.
Das ganze mache ich auch für die zweite Zeile. Wenn nun der Case aus Zeile 1 gleich dem Case aus Zeile 2 ist, soll er die beiden Namen ausgeben.
Irgendwie funktioniert das ganze aber nicht, ich bekomme immer sowas raus: STEINER; STEINER:
Es scheint als würde er zwischen den Zuweisungen zu Name1,Case1 und Name2, Case2 nicht in die nächste Zeile springen?!
Java:
public void run() throws FileNotFoundException {
        String csvFile = "D://Users/Stefan/workspace/Filterperson6/src/gefiltertfuertest1.csv";
        BufferedReader br = null;
        String line ="";
        String lastline=null;
        String cvsSplitBy = ";";
        try {
            br = new BufferedReader(new FileReader(csvFile));
            br.readLine();//erste Zeile mit den Spaltenköpfen wird eingelesen und verworfen, soweit ok.
            while ((line = br.readLine()) != null) {
                // use semicolon as separator
                String[] Name = line.split(cvsSplitBy);
                line=lastline;
                String Name1 = Name[3];
                String Case1 = Name[0];
                br.readLine();//die nächste Zeile wird eingelesen und verworfen. NICHT OK!
                String Name2 = Name[3];//Name ist noch unverändert, d. h. Name2 ist identisch mit Name1
                String Case2 = Name[0];//siehe oben, Case2 ist identisch mit Case1
                If (Case1.equals(Case2));//der If-Block ist mit dem Semikolon abgeschlossen!
                    {
                    System.out.println(Name1 + ";" + Name2 +":");//dies sollte in jedem Fall ausgegeben werden!
                }
                line=lastline;
            }
        } catch (FileNotFoundException e) {
}
Zu deinem letzten Post: Ich habe deine Logik auch nicht so ganz verstanden.:bahnhof:
Eigentlich musst nur feststellen, ob der jeweilige Eintrag in einer geradzahligen (even) oder ungeradzahligen (odd) Zeile steht. Für beide Fälle brauchst du einen lastCase und lastName. Falls der Eintrag in einer "geraden" Zeile steht (i % 2 == 0), vergleichst du die Werte aus der aktuellen Zeile mit "lastEvenCase" und "lastEvenName", und setze dann lastEvenCase und lastEvenName neu. Falls der Eintrag in einer "ungeraden" Zeile steht, vergleichst du die aktuellen Werte mit "lastOddCase" und "lastOddName".
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Ich würd das mit ein oder zwei Queues lösen.

Die Kopfzeile verwirfst du. Dann beginnt die Schleife und füllst die Queues bis zwei Elemente drinnen sind und dann kannst du zum Vergleichen beginnen:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.Queue;

public class Test {
  public static void main(String... args) {
    String csv = "CASE; BELNR; ACTNAME; RESOURCE;\n10000_0;100002350; FB01 ; STEINER;\n10000_0;100002357; VF01 ; UHLE;\n10001_0;1400000768; FBZ1 ; UHLE;\n10001_0;100002357; FB01 ; STEINER;\n10001_0;100002357; FB01 ; STEINER;";
    printPersons(csv);
  }
  
  public static void printPersons(String csv) {
    try (BufferedReader br = new BufferedReader(new StringReader(csv))) {
      String line;
      Queue<String> nameQueue = new LinkedList<String>(), caseQueue = new LinkedList<>();
      
      for (int i = 0; (line = br.readLine()) != null; i++) {
        if (i != 0) {
          String[] split = line.split(";");
          String curCase = split[0];
          String curName = split[3];
          caseQueue.offer(curCase);
          nameQueue.offer(curName);
          if (i > 2) {
            if (caseQueue.poll().equals(curCase)) {
              System.out.println(nameQueue.poll() + " -> " + curName);
            }
          }
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
 

StefanF195

Mitglied
hey, vielen Dank nochmal für Eure Mühe.
Hat auch super funktioniert, allerdings habe ich einen heftigen Denkfehler gemacht.
Die Sache ist, wie ich finde jetzt richtig kompliziert.
Ich möchte wenn der Case gleich ist nicht nur 1und3, 2und4 usw miteinander ausgeben sondern auch 1und4 usw, wenn der Case der gleiche ist.
Hast du eine Idee, wie man da ansetzen könnte?
Ich steh völlig aufm Schlauch
 

Flown

Administrator
Mitarbeiter
Am besten alles in eine Liste werfen und dann kannst du damit machen, was du willst. Drüber iterieren, alles miteinander vergleichen, etc.
 

StefanF195

Mitglied
Hey Flown,
vielen Dank für deine schnelle Antwort. Ich habe mich nochmal rangemacht und versucht das so umzusetzen.
Leider habe ich wohl noch ein paar Denkfehler bezüglich der Umsetzung mit einer Liste.
Ich sehe leider nicht genau wo meine Fehler sind. Rein logisch müsste es so funktionieren.
Java:
			 	try{
			 		File file = fileChooser.getSelectedFile();
			 		System.setOut(new PrintStream(new File("indirect.csv")));
		 			String csvFile = file.getPath();
		 			BufferedReader br = null;
		 			br = new BufferedReader(new FileReader(csvFile));
					br.readLine();
					List<String> CaseListe = new ArrayList();
					List<String> NameListe = new ArrayList();
					String line;
					for (int i = 0; (line = br.readLine()) != null; i++) 
					{
						String[] split = line.split(";");
						CaseListe = split[0];
						NameListe = split[3];
						
					}
					
					while(CaseListe.hasNext() && NameListe.hasNext())
					{
						for (int j = 3; ; j++)
						{
						
							for(int i = 1; ;i++)
								{
									if (CaseListe(i)==CaseListe(j))
								
										{
											System.out.println(Caseliste(i)+ ";" + Caseliste(i++));
											i=i--;
										}
									else
									{
										j=i+2;
									}
								}
						}
					}
					
					
			 		
			 	} catch (IOException e) {
					e.printStackTrace();
				}
 

Flown

Administrator
Mitarbeiter
Wow ich kann dir nur raten zu den Grundlagen zurückzukehren. Man aggregiert solche Zeilen in eine Klasse und kann dann damit arbeiten:

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

public class Test {
  public static void main(String... args) {
    String csv = "CASE; BELNR; ACTNAME; RESOURCE;\n10000_0;100002350; FB01 ; STEINER;\n10000_0;100002357; VF01 ; UHLE;\n10001_0;1400000768; FBZ1 ; UHLE;\n10001_0;100002357; FB01 ; STEINER;\n10001_0;100002357; FB01 ; STEINER;";
    List<Artifact> artifacts = readFile(csv);
    
    for (int i = 0; i < artifacts.size(); i++) {
      Artifact artifact = artifacts.get(i);
      for (int j = i + 1; j < artifacts.size(); j++) {
        Artifact other = artifacts.get(j);
        if (artifact.getCaseName().equals(other.getCaseName())) {
          System.out.println(artifact.getResourceName() + " -> " + other.getResourceName());
        }
      }
    }
  }
  
  public static List<Artifact> readFile(String csv) {
    List<Artifact> artifacts = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new StringReader(csv))) {
      String line;
      for (int i = 0; (line = br.readLine()) != null; i++) {
        if (i != 0) {
          String[] split = line.split(";");
          artifacts.add(new Artifact(split[0], Long.valueOf(split[1]), split[2], split[3]));
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return artifacts;
  }
  
  static class Artifact {
    private String caseName, actName, resourceName;
    private long belNr;
    
    public Artifact(String caseName, long belNr, String actName, String resourceName) {
      this.caseName = caseName;
      this.belNr = belNr;
      this.actName = actName;
      this.resourceName = resourceName;
    }
    
    public String getCaseName() {
      return caseName;
    }
    
    public void setCaseName(String caseName) {
      this.caseName = caseName;
    }
    
    public String getActName() {
      return actName;
    }
    
    public void setActName(String actName) {
      this.actName = actName;
    }
    
    public String getResourceName() {
      return resourceName;
    }
    
    public void setResourceName(String resourceName) {
      this.resourceName = resourceName;
    }
    
    public long getBelNr() {
      return belNr;
    }
    
    public void setBelNr(long belNr) {
      this.belNr = belNr;
    }
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
M Registry Autostart Eintrag ertstellen mit Java (Runtime.getRuntime().exec()) Allgemeine Java-Themen 0
Ananaskirsche Input/Output Datei durchlesen und Eintrag herauschreiben Allgemeine Java-Themen 18
B MySQL Eintrag erstellen Allgemeine Java-Themen 3
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
J Eintrag in Datei überschreiben Allgemeine Java-Themen 6
H JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional) Allgemeine Java-Themen 3
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
S MANIFEST DATEI hat nur einen Eintrag Allgemeine Java-Themen 14
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
J Path-Eintrag unter Windows 7 Allgemeine Java-Themen 11
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
E Swing hilfe, JWindow mit eintrag in taskleiste Allgemeine Java-Themen 2
M Javadoc | Javadoc Eintrag des verlinkten Element einbetten? Allgemeine Java-Themen 4
D Eintrag im Windows Kontextmenü hinzufügen Allgemeine Java-Themen 4
T LDAP - Eintrag löschen Allgemeine Java-Themen 6
B ArrayList eintrag löschen Allgemeine Java-Themen 3
G Hashset einen eintrag zufällig entfernen Allgemeine Java-Themen 4
thE_29 Kontextmenü Shell Eintrag Allgemeine Java-Themen 35
A Mehrzeiligen Eintrag in Ressourcebundle (.properties-Datei) Allgemeine Java-Themen 8
Luma Diskettenlaufwerk rattert los bei Eintrag in JTree Allgemeine Java-Themen 6
B JComboBox-Eintrag ohne Enter aktualisieren Allgemeine Java-Themen 2
T Array - Wert am nächsten zur vollen Sekunde Allgemeine Java-Themen 20
T [Joda Time] Nächsten Samstag finden Allgemeine Java-Themen 8
C Millisekunden bis zur nächsten vollen Stunde Allgemeine Java-Themen 3
H JavaFX Warnung in package Zeile Allgemeine Java-Themen 2
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
M Checkstyle 100 Zeichen pro Zeile Allgemeine Java-Themen 11
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
Bluedaishi Zeile um zeichen erweitern Allgemeine Java-Themen 9
M String automatisch in nächste Zeile umbrechen (Graphics) Allgemeine Java-Themen 6
J Bestimmte Zeile aus Textdatei auslesen Allgemeine Java-Themen 18
KeVoZ_ Nacheinander folgende Strings in Textdokument auf neue Zeile schreiben Allgemeine Java-Themen 6
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
KeVoZ_ Bestimmte Zeile aus Console finden & auslesen Allgemeine Java-Themen 2
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
C Speicherung fon Zeile und Spalte Allgemeine Java-Themen 2
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
Ananaskirsche Input/Output Zeile aus Datei einlesen Allgemeine Java-Themen 10
F JTextArea Cursor in die nächste Zeile setzen Allgemeine Java-Themen 2
C Input/Output Bestimmte Zeile in Datei ändern. Allgemeine Java-Themen 13
M Startdatei konnte nicht geparst werden. Fehler in Zeile 0 Allgemeine Java-Themen 5
127.0.0.1 StringBuffer leere Zeile löschen Allgemeine Java-Themen 8
S Die Zeile die JUnit gerade ausführt lesen Allgemeine Java-Themen 15
X Scanner hört nach der 25. Zeile auf Allgemeine Java-Themen 6
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
1 InputStream liest die letzte Zeile nicht ein Allgemeine Java-Themen 2
S String aus Datei-Zeile auslesen Allgemeine Java-Themen 6
C Zeile aus einer CSV-Datei löschen Allgemeine Java-Themen 3
FoolMoon Datei zeilenweise einlesen, aber nicht die erste Zeile! Allgemeine Java-Themen 3
neonfly Anzahl Zeichen pro Zeile auf der Konsole Allgemeine Java-Themen 8
H RandomAccessFile - Zeile finden Allgemeine Java-Themen 5
S readLine() liest nur jede 2. Zeile Allgemeine Java-Themen 3
J Mit POI Zeile in Excel löschen Allgemeine Java-Themen 5
P readLine() liest nur jede dritte Zeile? Allgemeine Java-Themen 3
G Zeile einfügen in TreeTable Allgemeine Java-Themen 2
M .txt Datei öffnen und jede Zeile mit festem String verketten Allgemeine Java-Themen 5
O Zeile eines Textfiles löschen Allgemeine Java-Themen 2
B in file immer 2. zeile überschreiben Allgemeine Java-Themen 8
J Text einer .csv Datei einlesen und Zeile in NEUE Zeile hänge Allgemeine Java-Themen 1
B Logs - txt-Datei neue Zeile anfuegen, neue Datei erstellen Allgemeine Java-Themen 6
S Zweidimensionales Array neue Zeile erzeugen Allgemeine Java-Themen 3
P Neue Zeile Plattformunabhängig Allgemeine Java-Themen 3
I Zeile überprüfen Allgemeine Java-Themen 12
P JTable selektierte Zeile mitwandern Allgemeine Java-Themen 2
Saxony Letzte Zeile eines Streames mit auslesen Allgemeine Java-Themen 4
H Notepad - Mitgabeparameter um in eine Zeile zu springen Allgemeine Java-Themen 15
M Funktion liest nach Textaus aus der vorigen Zeile Allgemeine Java-Themen 2
TheJavaKid Zeile auf existenz von String prüfen. Allgemeine Java-Themen 19
R Einzelne Zeile manipulieren Allgemeine Java-Themen 4
M Datei und Zeile im Code Allgemeine Java-Themen 2
J Matrix mit unterschiedlicher Anzahl von Spalten pro Zeile? Allgemeine Java-Themen 4
W gezielt eine Zeile einlesen? Allgemeine Java-Themen 6
byte Erste Zeile einer Textdatei entfernen Allgemeine Java-Themen 5
L JTable: Wenn Zeile markiert dann Meldung. geht nicht Allgemeine Java-Themen 4
V Class Document seltsam leere Zeile am Anfang Allgemeine Java-Themen 8
G String in String-Array umwandeln in einer Zeile? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben