Mit line.split() leider unterschiedliche Anzahl von Spalten

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo Javagemeinde,

mir raucht leider mal wieder der Kopf.
Ich lese eine Datei zur Weiterverarbeitung ein. Leider ist das Inputformat ziemlich chaorisch.

Das ist meine Vorgabe aus der Datei:

"MA1
MA2
MA3
MA4" "19.12.2003" "ganztägig" "10:00" "10:15"

Eigentlich sollte es so aussehen:

"MA1" "19.12.2003" "ganztägig" "10:00" "10:15"
"MA2" "19.12.2003" "ganztägig" "10:00" "10:15"
"MA3" "19.12.2003" "ganztägig" "10:00" "10:15"
"MA4" "19.12.2003" "ganztägig" "10:00" "10:15"

D.h. ich habe unterschiedliche Anzahlen von Spalten pro Zeile. Ich muss mir nun die Zeilen mit den Inhalten MA1, MA2 ... merken, und wenn ich auf MA 4 treffe, den Inhalt von MA4 auf MA1 - MA 3 duplizieren.

Ich habe leider gar keinen Plan, wie ich das anstellen kann. Dazu kommt noch , dass die Anzahl der MA1-MA3 natürlich MA n sein kann.

Wie könnte ich das Problem angehen?

Grüße und danke für einen Tipp.
 
spidermobile hat gesagt.:
[..]
"MA1
MA2
MA3
MA4" "19.12.2003" "ganztägig" "10:00" "10:15"

Sieht die Datei wirklich so aus, wie von dir oben beschrieben, d.h mit Zeilenumbrüchen?

Wenn ja, dann wird das schwierig werden.
 
Hi Wildcard,

ja, das mit dem RegEx habe ich bereits von Dir erfahren, habe es gelernt, und wende es auch an. Was ich mache. Ich habe mir ein kleines Projekt zum Lernen von Java hergenomen.
Ich lese aus unserem System im Büro die Daten in ASCII ein und baue mir in Java einen Offline-Reader.
Leider werden die Termine, wenn diese für mehrere Teilnehmer sind, so doof exportiert.

Das Einlesen, RegEx und weiterverarbeiten habe ich bereits fertig. Nun fehlt mir nur noch eine Lösung für dieses Problem.
 
Hi abollm,

ja das ist ja mein Problem. Das ist ein Datenexport aus einem Terminsystem. Die Erfinder waren wohl leider nicht sehr kreativ, oder doch :roll: .
 
Wie gesagt, erklär mir mal genauer was du bekommst, und was dann passieren soll.
Was du mit dublizieren meinst versteh ich nicht wirklich.
 
Hi spidermobile,

was ist das für ein System, aus dem exportiert wird? Ist das Standardsoftware à la Lotus Notes etc.? Wenn ja, dann könnte es eine Frage der Konfiguration sein.

Ich habe in dem Bereich ja schon viel erlebt, aber das ist mir in meiner Praxis, in der ich mich fast ständig mit ASCII-Dateiimporten herumschlagen muss, noch nicht untergekommen.

Gruß
 
oki,

das problem ist bei einem Termin, der von mehreren Personen wargenommen wird. Dann stehr leider nicht an jeder Person der komplette Termin, sondern leider nir der Name, also MA1 - MA3 und an MA 4 der Name und der Rest. Also muss ich mir wohl irgendwie die Namen von MA1 - MA3 merken, erkennen dass MA 4 nun alle Informationen hat, dann die Informationen:

"19.12.2003" "ganztägig" "10:00" "10:15" von MA 4 auf MA1 - MA 3

übertragen.

Rückwärtslesen wäre ein möglicher Ansatz. Dann bekomme ich nämlich zuerst MA4, dann würde vieles leichter werden.
 
spidermobile hat gesagt.:
[..]
Rückwärtslesen wäre ein möglicher Ansatz. Dann bekomme ich nämlich zuerst MA4, dann würde vieles leichter werden.

OK, verstanden. Aber das Problem sind die Zeilenumbrüche innerhalb _eines_ Datensatzes. Kann man das evtl. umkonfigurieren seitens des führenden Terminverwaltungssystems?
 
Also der erste gefundene vollständige Eintrag soll die anderen ergänzen?
Sollte machbar sein, ich schau mal ob ich schnell ein passendes Pattern basteln kann...
 
Hi abollm,

nein das ist leider ein sehr altes System, welches in Kürze auch abgelöst wird. Da liegt auch keine vernünftige DB dahinter, sonst würde ich diese anzapfen.

Wie schon gesagt, ich lerne mit dieser Aufgabe nur. Da dieses Problem wohl eine kleine Herausforderung darstellt, lerne ich bestimmt viel 🙂
 
Also hier mein Vorschlag:
-String umdrehen und von hinten lesen
-die datensätze trennen(mit datensatz meine ich hier MA4-MA1 und so weiter)
-mit diesem Pattern den hinteren(jetzt vorderen Teil) raustrennen und an die Unvollständigen anfügen

Code:
(".*")("\w+")
Fehlt noch das Pattern um die Datensätze zu trennen. Ist dir bekannt wie viele Personen zu einem Satz gehören?
Währe einfacher...
 
Code:
public class RegExTest
{

    public static void main(String[] args)
    {
        StringBuffer b = new StringBuffer("\"MA1\"\n\"MA2\"\n\"MA3\"\n\"MA4\" \"19.12.2003\" \"ganztägig\" \"10:00\" \"10:15\"\n" + "\"MA1\"\n\"MA2\"\n\"MA3\"\n\"MA4\" \"19.12.2003\" \"ganztägig\" \"10:00\" \"10:15\"");

        b.reverse();
        //damit die letzte(bzw. erste) zeile erkannt wird
        b.append("\n");
        Pattern pat = Pattern.compile("(.*?)(\"\\w+\"\\n)",Pattern.DOTALL);
        Matcher mat = pat.matcher(b.toString());
        b = new StringBuffer();
        String save ="";
        while (mat.find())
        {
            System.out.print(mat.group(1));
            if (!mat.group(1).equals(""))
                save= mat.group(1);
            
            System.out.print(mat.group(2));
            b.append(save);
            b.append(mat.group(2));
        }
        b.deleteCharAt(b.length()-1);
        b.reverse();
        System.out.println(b);
    }
}

richtig schön hässlich! In ordnung bringen musst du's selbst :wink:
 
Hallo Wildcard,

vielen lieben Dank für diesen Ansatz. Ich werde mich gleich heute Abend an die Arbeit machen.

Grüße

Rocco.
 
Hallo Wildcard,

falls Du noch mal reinschaust. Es ist nicht schön, aber ich habe es nun anders gelöst. Deine Lösung ist zwar viel besser, aber bei über 60.000 Sätzen vielleicht nicht die schnellste. Ferner hat das mit dem RegEx auch nicht so ganz gepasst. Sorry die Beispieldaten waren schlecht.

Ich poste mal mein Ergebnis (nicht schön aber es läuft)!

Code:
	   try { 
			FileInputStream fis = new FileInputStream(setprop.getDataPathTermine());
			InputStreamReader isr = new InputStreamReader(fis, setprop.getISO_Charset());
			BufferedReader buff = new BufferedReader(isr);			

			boolean eof = false; 
			int count = 0;
		    
			int pid = 0;      
			while(!eof) { 
				String line = buff.readLine();
				if (line == null) 
				   eof = true;
				else { 
					line = line.replaceAll("\"\"","\"keine\"");		
					line = line.replaceAll("\"","");					
					String[] array = line.split("\t"); 

					// Aufbau eines temp Arrays für Namen (temporär)
					if (array.length == 1) {
						more = true;
						tmpname.add(array[0]);
					} else {
						// Zusammenbauen der temp Arraydaten zum Gesamttermin
						if (more) {
							// hier aus temp Vector mit restlichen Daten Satz zusammenbauen
							Iterator iter = tmpname.listIterator();
							while(iter.hasNext())
							{
								ergname = (String)iter.next();
								datatermine.add(new DataTermineClass( ergname, array[1], array[2], array[3], array[4],  array[5], array[6], array[7], array[8], array[9], array[10], array[11], pid));
							}
							tmpname.clear();
							more = false;
						}
						more = false;
						datatermine.add(new DataTermineClass( array[0], array[1], array[2], array[3], array[4],  array[5], array[6], array[7], array[8], array[9], array[10], array[11], pid));
					}
					pid++;
				}
			}   
		buff.close();
		}
		catch (IOException e){ 
			System.out.println("Error-- " + e.toString()); 
		}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben