andy1987
Goto Top

Strings zusammenfügen

Guten Abend,

ich habe ein Problem beim zusammenführen von zwei Arrays. Ich habe bisher leider auch noch keine Idee wie ich an diese sache heran gehen soll.

Ich habe folgenden Zustand:

Ich habe zwei Dateien, die ich aufgeteilt in mehrere Variablen (Arrays) einlese.

Zum Beispiel:

Datei Eins:
123456
234567
345678

Lese ich in drei Variablen Ein:

Dim Kennung(10) As String (Hier werden die ersten zwei Zeichen eingelesen)
Dim Wert1(10) As String (Hier die nächsten Zwei)
Dim Wert2(10) As String (Hier die nächsten Zwei)

Das gleiche mache ich mit einer zweiten Datei in drei weitere Variablen (Arrays).

Dim Kennung2(10) As String
Dim Wert1_2(10) As String
Dim Wert2_2(10) As String

Ich möchte diese Variablen nun zusammenführen bzw. gegenüberstellen.

Das ganze soll in eine Art Tabelle geschrieben werden

Kennung Wert 1 Wert 2 Wert1_2 Wert1_2

Die Ausgegabe mit nur einem Array ist relativ einfach und würde so aussehen:
Kennung Wert 1 Wert 2 Wert1_2 Wert1_2
12 34 56
23 45 67
34 56 78


Wenn im zweiten Array das Feld Kennung jedoch identisch ist mit einem Wert aus dem ersten Array, sollen die entsprechenden Werte in die schon vorhandene Zeile eingetragen werden. Wenn nicht, soll eine weitere Zeile eingefügt werden.


Wie kann ich das ganze Aufbauen? Ist eine Zuweisung bei der Ausgabe sinnvoll? Oder muss ich vorher die Arrays zusammenführen und dann ausgeben? Wenn ja wie? Ich habe hierzu echt überhaupt keine Idee. Ich hoffe ihr könnt mir helfen. Vielen Dank im Voraus.

Content-ID: 149740

Url: https://administrator.de/contentid/149740

Ausgedruckt am: 16.11.2024 um 07:11 Uhr

bastla
bastla 25.08.2010 um 21:00:35 Uhr
Goto Top
Hallo Andy1987!

Ich frage jetzt mal nicht, wozu das jeweils 3 Arrays sein müssen und noch nicht mal, welches VB Du eigentlich verwendest, ...

... sondern werfe nur kurz das Stichwort "Dictionary" in die (beginnende) Diskussion ... face-wink

Grüße
bastla
Andy1987
Andy1987 26.08.2010 um 07:48:18 Uhr
Goto Top
Guten Tag,

ich verwende VB 2008 Express.

Wegen den drei Arrays - Ich wüsste nicht wie ich das Ganze sonst aufbauen soll. Gibt es sonst noch einen Weg?

Was meinst du mit "Dictionary"?
bastla
bastla 26.08.2010 um 08:48:24 Uhr
Goto Top
Hallo Andy1987!

Dictionary: http://msdn.microsoft.com/en-us/library/x4k5wbx4%28VS.85%29.aspx (oder auch einmal in VB 2008 Express eingeben) ...

Wegen den drei Arrays - Ich wüsste nicht wie ich das Ganze sonst aufbauen soll. Gibt es sonst noch einen Weg?
Bisher kennst ja nur Du "das Ganze" - beschrieben hast Du nur (in etwa), was Du technisch gesehen machst und was Du erreichen willst - den Zweck der Aktion hast Du nicht erklärt ...

Grüße
bastla
Andy1987
Andy1987 26.08.2010 um 19:25:29 Uhr
Goto Top
Den Link sehe ich mir mal an.

Ziel ist es eine Lesbare Aufstellung zu erstellen, zwei Dateien bzw. bestimmte Inhalte abgeglichen und auf Richtigkeit geprüft werden.
bastla
bastla 26.08.2010 um 19:33:23 Uhr
Goto Top
Hallo Andy1987!

Na ja, wenn das so ist wundert es mich ja schon fast, dass Du mit je 3 Arrays auskommst (wenn man/frau nur mal an die differenzierte Darstellung der Delta-Datenwerte denkt) ... face-surprise

Grüße
bastla
Biber
Biber 26.08.2010 um 20:04:32 Uhr
Goto Top
Moin Andy1987,

bastlas höflich formulierte Frage war:
"Bisher kennst ja nur Du "das Ganze" - beschrieben hast Du nur (in etwa), was Du technisch gesehen machst und was Du erreichen willst - den Zweck der Aktion hast Du nicht erklärt ..."

Deine Antwort darauf war:
"Ziel ist es eine Lesbare Aufstellung zu erstellen, zwei Dateien bzw. bestimmte Inhalte abgeglichen und auf Richtigkeit geprüft werden."

Gibt es irgendein Sender-Empfänger-Problem?
Kann ich irgendwie unterstützen?

Wenn du deinen Audi A8 bei irgendeiner Tanke reparieren lassen willst - sagst du dann auch "Ich muss damit am Wochenende bis nach Oldenburg kommen - bekommen Sie das hin bis 17h?".

Grüße
Biber
Andy1987
Andy1987 27.08.2010 um 08:31:27 Uhr
Goto Top
Also Okay ich probiere es noch mal.

Ich habe zwei Dateien, die ich in mehrere Variablen [Arrays) einlese. Hier bei gibt es in beiden Dateien eine eindeutige Nummern. Diese Nummern sind auch extra Variablen eingelesen.
Die Werte aus den Variablen sollen in einer Tabelle gegenübergestellt ausgegeben werden:

Bespiel:

Datei1_Eindeutige_Nummer(1) = 10 Datei1_Werte(1) = abc
Datei1_Eindeutige_Nummer(2) = 20 Datei1_Werte(2) = 123
Datei1_Eindeutige_Nummer(3) = 30 Datei2_Werte(3) = xyz

Datei2_Eindeutige_Nummer(1) = 10 Datei2_Werte(1) = abc
Datei2_Eindeutige_Nummer(2) = 20 Datei2_Werte(2) = 123
Datei2_Eindeutige_Nummer(4) = 40 Datei2_Werte(3) = 789

Diese beiden Arrays sollen jetzt in einer Art Tabelle ausgegeben werden. Hierfür will ich Textboxen nehmen. Was auch kein Problem ist.

Die Ausgabe soll wie folgt aussehen:

Datei1 Eindeutige Nummer Datei1_WErte Datei2_EindeutigeNummer Datei2_Wertze
10 abc 10 abc
20 123 20 123
30 xyz
40 789
bastla
bastla 27.08.2010 um 10:28:22 Uhr
Goto Top
Hallo Andy1987!

Schematisch könntest Du das etwa so versuchen:
        Dim d = CreateObject("Scripting.Dictionary")  
        Dim Key As String

        For i = 0 To UBound(Datei1_Eindeutige_Nummer) 'Array der Datei1 durchgehen  
            Key = Datei1_Eindeutige_Nummer(i)
            If d.Exists(Key) Then 'Eindeutige_Nummer in Datei 1 war nicht eindeutig - ...  
                d.Item(Key) = d.Item(Key) & vbTab & "(1) " & Datei1_Werte(i) '... daher weiteren Wert (mit Kennzeichnung) dem Eintrag hinzufügen  
            Else
                d.Add(Key, Key & vbTab & Datei1_Werte(i)) 'Dictionary-Eintrag hinzufügen  
            End If
        Next

        For i = 0 To UBound(Datei2_Eindeutige_Nummer) 'Array der Datei1 durchgehen  
            Key = Datei2_Eindeutige_Nummer(i)
            If d.Exists(Key) Then
                d.Item(Key) = d.Item(Key) & vbTab & Datei2_Werte(i) 'Eintrag für auch in Datei1 vorhandenen Datensatz ergänzen  
            Else
                d.Add(Key, Key & vbTab & vbTab & Datei2_Werte(i)) 'Datensatz nur in Datei2 vorhanden - Eintrag neu erstellen  
            End If
        Next

        TextBox1.Text = Join(d.Items, vbCrLf) 'Alle Einträge unter Verwendung einer Zeilenschaltung als Trennung zu einem String kombinieren und in die (Multiline-)"TextBox1" eintragen  
Unter der Annahme, dass die "Eindeutige_Nummer" zumindest in der "Datei1" tatsächlich nur je einmal vorkommen kann, wären die Zeilen 6-8 und 10 nicht erforderlich - falls aber dennoch ein Schlüssel in der ersten Datei mehrfach vorhanden wäre, würde ab dem zweiten Auftreten dem Wert "(1)" als Kennung vorangestellt ...

Um darauf hinzuweisen, dass ein Datensatz in "Datei1" nicht vorkommt, könntest Du in Zeile 18 zwischen die beiden "vbTab" noch zB "-" platzieren ...

Grüße
bastla
76109
76109 27.08.2010 um 11:42:18 Uhr
Goto Top
Hallo Andy1987, Hallo bastla!

Obwohl bastla Dein Problem ja schon ideal gelöst hat face-smile, hier trotzdem noch die etwas aufwendigere rein spielerische Array-Variante, damit's noch ein wenig interssanter wirdface-wink
Option Explicit

Const Datei1 = "123456" & vbCrLf & "234567" & vbCrLf & "345678"	'Improvisierter Dateiinhalt Datei1  
Const Datei2 = "124734" & vbCrLf & "224567" & vbCrLf & "341278"	'Improvisierter Dateiinhalt Datei2  

Private Sub Test()
    Dim Text1 As Variant, Text2 As Variant, TextLine As Variant, Key As String, Item As String
    Dim Values As Variant, ValuesSize As Long, ValuesCount As Long, i As Long
    
    Text1 = Split(Datei1, vbCrLf)   'Textzeilen aus Datei1 in Array einlesen  
    Text2 = Split(Datei2, vbCrLf)   'Textzeilen aus Datei2 in Array einlesen  
    
    ValuesSize = UBound(Text1) + UBound(Text2) + 1  'Größe des Arrays = Anzahl Zeilen + 1  
    
    ReDim Values(ValuesSize, 1) As String           'Array deklarieren  
    
    ValuesCount = 0                                 'Array-Zähler  
    
    For Each TextLine In Text1                      'Textzeilen aus Datei1 lesen  
        If IsNumeric(TextLine) Then                 'Test Zahlenwert  
            Key = Left(TextLine, 2)                 'Key = Kennnummer  
            Item = Key & " " & Mid(TextLine, 3, 2) & " " & Mid(TextLine, 5,2)  'Item = Key + Werte  
            Values(ValuesCount, 0) = Key            'Key in Array schreiben  
            Values(ValuesCount, 1) = Item           'Item in Array schreiben  
            ValuesCount = ValuesCount + 1           'Arrayzähler + 1  
        End If
    Next
    
    For Each TextLine In Text2                      'Textzeilen aus Datei2 lesen  
        If IsNumeric(TextLine) Then                 'Test Zahlenwert  
            Key = Left(TextLine, 2)                 'Key = Kennnummer  
            For i = 0 To UBound(Values)             'Array nach Key durchsuchen  
                If Key = Values(i, 0) Then Exit For 'Wenn gefunden For-Schleife verlassen  
            Next
            
            If i <= UBound(Values) Then             'Test ob Key gefunden  
                Item = Mid(TextLine, 3, 2) & " " & Mid(TextLine, 5,2) 'Wenn ja, Items = Werte  
                Values(i, 1) = Values(i, 1) & " " & Item    'Werte dem aktuellen Key hinzufügen  
            Else
                Item = Key & " " & Mid(TextLine, 3, 2) & " " & Mid(TextLine, 5,2) 'Item = Key + Werte  
                Values(ValuesCount, 0) = Key        'Wenn nein, Key in Array schreiben  
                Values(ValuesCount, 1) = Item       'Item in Array schreiben  
                ValuesCount = ValuesCount + 1       'Arrayzähler + 1  
            End If
        End If
    Next
    
    For i = 0 To UBound(Values)     'Array auslesen  
        If Values(i, 0) <> "" Then  'Test Leer  
            MsgBox Values(i, 1)     'Ausgabe eines Eintrags in Form 12 34 56 47 34  
        End If
    Next
End Sub
Hierbei unter der Annahme, dass je Datei das Kennwort nur einmal vorkommt. Außerdem habe ich das Kennwort auch nur einmal pro Eintrag verwendet.

Gruß Dieter
Andy1987
Andy1987 27.08.2010 um 13:07:38 Uhr
Goto Top
Vielen Dank für die Antworten. Ich werde das Ganze heute Abend in Ruhe testen und rückmeldung erstatten.