phoboz
Goto Top

VBA zwei txt.Dateien, Datensätze anhand von Suchkriterien lokalisieren , Datensätze bearbeiten

Guten Tag,

könntet ihr mir bitte helfen, bin ein VBA-Anfänger, habe zwar schon einiges gemacht allerdings nur mit xls. Dateien. Bei dieser Aufgabe habe ich 2 .txt-Dateien diese sehen wie folgt aus:

Datei 1:

<Titel>
<ID>657</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/money.mp3/Abba/Abba Gold/</Path>
<Info>...</Info>
</Titel>

<Titel>
<ID>111</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/Abba/Abba Gold/Waterloo.mp3</Path>
<Rating>5</Rating>
<Info>...</Info>
</Titel>

<Titel>
<ID>012</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/Abba/Mama Mia.mp3/Abba Gold</Path>
<Rating>4</Rating>
<Info>...</Info>
</Titel>


Datei 2:

<Titel>
<ID>555</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/Abba/Abba Gold/Mama Mia.mp3</Path>
<Rating>3</Rating>
<Info>...</Info>
</Titel>

<Titel>
<ID>560</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/Abba/Abba Gold/Waterloo.mp3</Path>
<Info>...</Info>
</Titel>

<Titel>
<ID>570</ID>
<Artist>ABBA</Artist>
<Album>ABBA Gold</Album>
<Path>C:/Music/Abba/Abba Gold/money.mp3</Path>
<Rating>3</Rating>
<Info>...</Info>
</Titel>


Die Aufgabe hierzu ist wie folgt. Wie ihr seht gibt es in diesen Txt. Dateien jeweils 3 Datensätze. Ein Datensatz beginnt immer mit <Titel> und endet mit </Titel> und besteht aus Artist, Album, Pfad, Rating und Info. Das Rating aus Datei1 soll in Datei2 übernommen werden.

D.h. der Programmablauf sollte in etwa so aussehen: Erstelle Datei3 (leere txt.Datei). Kopiere ersten Datensatz (<Titel>...</Titel> aus Datei2 und Suche den selben Datensatz anhand von "Artist", "Album" und "/*.mp3" (in Path) in Datei1. Ersetze Rating in dem Datensatz von Datei2 der dem Datensatz von Datei1 entspricht, das ganze steht dann korrekt in Datei3.

wenn das Rating in Datei 1 nicht vorhanden ist soll es auch in Datei3 nicht vorhanden sein.


Könnt ihr mir bitte helfen.


Grüße

Phoboz

Content-Key: 201941

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

Printed on: April 24, 2024 at 15:04 o'clock

Member: Phoboz
Phoboz Feb 18, 2013 updated at 13:38:16 (UTC)
Goto Top
Edit: Der Pfad unterscheidet sich zwischen Datei1 und Datei2. Das ist ebenfalls tricky... face-sad

(Siehe oben Datei1 und Datei2)
Member: bastla
bastla Feb 18, 2013 at 15:01:39 (UTC)
Goto Top
Hallo Phoboz und willkommen im Forum!

Was hast Du denn schon, wo klemmt's noch? Poste doch mal Deinen bisherigen Ansatz (unter Verwendung der "Code"-Formatierung) ...

Grüße
bastla
Member: Phoboz
Phoboz Feb 18, 2013 at 16:05:51 (UTC)
Goto Top
Hallo Bastla,

ich bin soweit, dass ich die beiden Dateien öffne und er den Inhalt in zwei Variablen schreibt. Ab diesem Punkt kriege ich nicht wirklich einen Ansatz hin, wie ich ihm sage, dass er sich den ersten Datensatz aus Datei2 nehmen soll (<Titel> bis </Titel> und diesen in Datei 3 schreibt. Danach soll er ja den Datensatz aus Datei1 suchen der durch die Suchkriterien Artist, Album und Path (/*mp3/) dem aus Datei2 entspricht und das Rating auf Datei1 anpassen.

habe den Code leider auf einem anderem Rechner. Werde diesen aber morgen einmal posten, aber vllt. könnt ihr damit schon was anfangen.

Das Suchkriterium: Album, Artist und Path ist auch ein bisschen problemmatisch, da Path ja in Datei2 etwas anders ausscht deswegen soll er der Zeile Path nur nach /*mp3/ suchen. (*=soundtrack von Datei1).
Member: bastla
bastla Feb 18, 2013 updated at 17:06:13 (UTC)
Goto Top
Hallo Phoboz!

Soferne Du nicht ohnehin XML-spezifische Elemente verwenden sollst, würde ich Dir das VBS-RegExp-Objekt (kannst Du unter VBA mit
Set regEx = CreateObject("VBScript.RegExp")
anstelle von
Set regEx = New RegExp
in VBS erzeugen) empfehlen ...

Um aus dem Pfad den Dateinamen zu isolieren könntest Du "Split()" oder "InStrRev()" und "Right()" oder am einfachsten die "GetFileName"-Methode des "FileSystemObject"s verwenden.

Grüße
bastla
Member: Phoboz
Phoboz Feb 18, 2013 at 17:06:10 (UTC)
Goto Top
Hallo,

muss es in VBA machen ist so in der Aufgabe vorgegeben face-sad
Member: bastla
bastla Feb 18, 2013 at 17:08:37 (UTC)
Goto Top
Hallo Phoboz!

Ist auch kein Beinbruch - nur eben vergleichsweise unelegant ...

BTW: Womit liest Du denn in VBA die Dateiinhalte ein?

Grüße
bastla
Member: Phoboz
Phoboz Feb 18, 2013 at 18:30:45 (UTC)
Goto Top
Hi Bastla,

ich schick morgen hierzu mal n bissl Code! Danke für die Hilfe schonma
Member: Phoboz
Phoboz Feb 19, 2013 updated at 06:49:44 (UTC)
Goto Top
So anbei einmal der Code, den ich bis jetzt hab, er soll eigentlich die Dateien öffnen und den Inhalt in einer Variablen schreiben allerdings ist hier ab "TXT1" iwie ein Fehler der Debugger meckert direkt rum. face-sad


Sub TraRating

Dim Datei1 As String
Dim Datei2 As String
Dim TXT1 As String
Dim TXT2 As String
Dim fs

MsgBox "Bitte wählen Sie die erste txt.Datei aus."  
Datei1 = Application.GetOpenFilename _
("Micrsoft Text-Dateien (*.txt),*.txt")  
      
MsgBox "Bitte wählen Sie die zweite txt.Datei aus."  
Datei2 = Application.GetOpenFilename _
("Micrsoft Text-Dateien (*.txt),*.txt")  

Set fs = CreateObject("Scripting.FileSystemObject")  
               
Set OpenDatei1 = fs.OpenTextFile(Datei1, 1)
TXT1 = Split(OpenDatei1.ReadAll, vbCrLf)
OpenDatei1.Close

Set OpenDatei2 = fs.OpenTextFile(Datei2, 1)
TXT2 = Split(OpenDatei2.ReadAll, vbCrLf)
OpenDatei2.Close
      
End Sub
Member: bastla
bastla Feb 19, 2013 updated at 06:37:46 (UTC)
Goto Top
Hallo Phoboz!

Der Fehler passiert nicht in Zeile 20, sondern in Zeile 5 - wenn Du "Split()" verwendest, entsteht aus dem String ein Array ...
Noch zu
muss es in VBA machen
Da Du das "Scripting.FileSystemObject" (kein VBA-Element) verwendest (verwenden darfst), wäre es nur konsequent, auch "VBScript.RegExp" einzusetzen - die Sprache der "Umgebung" bleibt in beiden Fällen VBA.

Grüße
bastla
Member: Phoboz
Phoboz Feb 19, 2013 at 06:41:27 (UTC)
Goto Top
wie gesagt danach weiß ich leider nicht wie ich weiterkomme, in Excell hat man ja Zellen. Wie bewegt man sich in Txt.Dateien. Kann man da auch richtig Zeile für Zeile abfragen? Bzw. geht das überhaupt das man ihm sagt Datensatz1 = <Titel> bis </Titel> und suche den Datensatz aus Datei2 der Datensatz1 entspricht anhand von Album, Artist und einem Teilstring von Path ("/*.mp3/)? Und wie kommt man dann zum nächsten Datensatz den man machen möchte?
Member: Phoboz
Phoboz Feb 19, 2013 at 08:23:50 (UTC)
Goto Top
Hallo,

der untenstehende Code macht jetzt folgendes:
Er nimmt die Datensätze aus Datei2 (diese sind bis auf das Rating korrekt) und schreibt sie in Datei3, die neu generiert wird.

Sub TraRating()

Dim Datei1
Dim Datei2
Dim Datei3

Dim txt

Dim fso

MsgBox "Bitte wählen Sie die erste txt.Datei aus."  
Datei1 = Application.GetOpenFilename _
("Micrsoft Text-Dateien (*.txt),*.txt")  
      
MsgBox "Bitte wählen Sie die zweite txt.Datei aus."  
Datei2 = Application.GetOpenFilename _
("Micrsoft Text-Dateien (*.txt),*.txt")  

Open Datei1 For Input As #1
Open Datei2 For Input As #2

Set fso = CreateObject("Scripting.FileSystemObject")  
    Set Datei3 = fso.CreateTextFile("M:\Datei3.txt", True)  

i = 1
    Do While Not EOF(2)
        Line Input #2, txt
        Datei3.WriteLine (txt)
        i = i + 1
    Loop
Close #2
Close #1

End Sub

Jetzt muss ich iwie wissen, wie ich es hinbekomme, dass er die Datensätze, die immer von <Titel> bis </Titel> gehen anhand von <Album>...</Album>, <Artist>...</Artist> und einen Teilstring von <Path>../*.mp3/</Path> indentifizieren kann.

Ich sag ihm also beginne bei <Titel> und ende bei </Titel> in Datei3 = Datensatz
Gucke in Datei1 und suche den gleichen Datensatz anhand von <Album>...</Album>, <Artist>...</Artist> und einen Teilstring von <Path>../*.mp3/</Path> und kopieren die Zeile <Rating> ... </Rating> und setze sie unter die Zeile <Path> in Datei3 in dem bestimmten Datensatz.