Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

ID`s/Werte aus Spalte(n) gegen txt/html Dateien matchen
#1
Hola!

Ich habe eine Excel-Liste mit zwei Spalten:

ID                        Wert

h2glo2OY            New York
KAWnAC7i           Los Angeles
iBGiVjBM              Chicago
7l95t51D             Houston
xb4HjmW9         Phoenix
1qMT6jeb            Philadelphia
88zFaDcI             San Antonio
KykVvd9l            San Diego
fGK1wg0H           Dallas
IviS4nei               San Jose

Dann habe ich EINE txt/html datei in der alle ID`s auf einmal gegen die individuellen Werte ausgetauscht werden sollen. 

Also statt einzeln ersetzen/durch, kollektives ersetzen/durch.

Dann habe ich noch VERSCHIEDENE txt/html dateien in der alle ID`s auf einmal gegen die individuellen Werte ausgetauscht werden sollen.

Also ID 1 in Datei 1 gegen Wert 1, ID 2 in Datei 2 gegen Wert 2 und ID 3 und 4 in Datei 3 gegen Wert 3 und 4 usw.

Statt einzeln ersetzen/durch, kollektives ersetzen/durch.

Ich kenne z.B. Notepad++ wo man in verschiedenen Dateien den einzelnen Wert "4711" auf einmal gegen den einzelnen Wert "4812" tauschen kann.

Aber wie kann ich sowohl alle ID`s in einer Datei als auch alle ID`s in mehreren Dateien ersetzen?
Top
#2
Hallöchen,

also, wenn Du bestimmte ID nur in bestimmten Dateien ersetzen willst, geht doch auch Notepad++. Du könntest doch z.B. den Dateifilter entsprechend verwenden?

Ansonsten, wenn Du was per Makro ersetzen willst, würde das mit der ID 3 und 4 die Sache verkomplizieren.

Zitat:Also ID 1 in Datei 1 gegen Wert 1, ID 2 in Datei 2 gegen Wert 2 und ID 3 und 4 in Datei 3 gegen Wert 3 und 4 usw.

Mit ID 1 in Datei 1 gegen Wert 1, ID 2 in Datei 2 gegen Wert 2 hätte man eine Logik drin, aber mit ID 3 und 4 in Datei 3 gegen Wert 3 und 4 war's das mit der Logik Sad

Du müsstest Dir auch eine Liste erstellen mit den Dateinamen und -pfaden und was darin gegen was (und ggf. wo) ausgetauscht werden soll.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Hallo,
Zitat:aber mit ID 3 und 4 in Datei 3 gegen Wert 3 und 4 war's das mit der Logik [img]
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Warum sollte das denn sein ?

Da nimmt man ein ParamArray oder ein Literal und arbeitet das in einer Schleife ab. Funktioniert mit einem Paar an Werten, oder mit 100 ... völlig egal.
Die Idee mit der Liste ist aber wieder gut ...
Top
#4
Hallöchen,

Zitat:aber mit ID 3 und 4 in Datei 3 gegen Wert 3 und 4 war's das mit der Logik
Warum sollte das denn sein ?
Da nimmt man ein ParamArray oder ein Literal und arbeitet das in einer Schleife ab. Funktioniert mit einem Paar an Werten, oder mit 100 ... völlig egal.

Datei 1 -> ID 1
Datei 2 -> ID 2
Datei 3 -> ID 3
Datei 4 -> ID 4

wäre mit einem einfachen Schleifenkonstrukt umzusetzen, da steckt eine gewisse Logik dahinter Idea

Datei 1 -> ID 1
Datei 2 -> ID 2
Datei 3 -> ID 3 ID4 (ich zitiere nochmal: "ID 3 und 4 in Datei 3 gegen Wert 3 und 4" )
Datei 4 -> ID 5 (oder nochmal ID 4 ???)
und vielleicht
Datei 5 -> ID 6, ID7, ID8 ??? :20:

Das dürfte auch weiblicher Logik entbehren :100:

Könnte aber auch sein der TE hat das nur unglücklich formuliert und es ist doch alles logisch Smile Bei einer Liste müsste man nur schauen, wie die z.B. wegen Datei 3 aufgebaut ist. Man könnte die Datei dann 2x aufführen oder man geht in solchen Fällen mit den "Austauschpaaren" weiter nach rechts.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
Hallo André,

ich meine das so ...

Öffnen der TXT als TextStream --> solange eine Schleife laufen lassen, bis InStr() keinen Treffer mehr ergibt --> dann zurückschreiben und speichern.
PHP-Code:
Sub ERSETZEN(ByVal Datei As StringParamArray eParam() As Variant)
Dim i As Long

For 0 To UBound(eParamStep 2
    MsgBox 
"Ersetze den Wert " eParam(1) & " durch " eParam(i)
Next i
End Sub

Sub x
()
Call ERSETZEN("Datei1""ID1""WERT1")
Call ERSETZEN("Datei1""ID3""WERT3""ID4""Wert4")
End Sub 

Wie groß das ParamArray ist, ist egal ... zur Not kann man dieses auch per JOIN oder einer Verkettung zusammensetzen.
Im Zweifel, legt man das aber alles mundgerecht in der Liste an, die du vorgeschlagen hast.

Na ... wie sieht es jetzt aus, mit der weiblichen Logik ? :32:
Top
#6
Hi Sabina,

ich glaube, wir reden ab und zu aneinander vorbei Confused

So was
Code:
Call ERSETZEN("Datei1", "ID1", "WERT1")
Call ERSETZEN("Datei1", "ID3", "WERT3", "ID4", "Wert4")
wäre in dem Sinne für mich keine Logik. Oder sollte ich besser sagen Systematik? Wenn Du da 50 Dateien unterschiedlich bearbeiten willst hast Du 50 Call's Sad

Meine Vorstellung von "Logik" zielt bei solchen Aufgaben in der Regel in Richtung einer Schleifenlösung.

Arbeitsblatt mit dem Namen 'Tabelle1'
ABCDEFG
1Datei 1AB
2Datei 2ABCD
3Datei 3ABCDEF
Verwendete Systemkomponenten: [Windows (32-bit) NT 10.00] MS Excel 2016
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Option Explicit
Dim strmsg
Sub test()
'Variablendeklarationen
Dim iCnt%, arrDaten
'Meldungstext zuruecksetzen
strmsg = ""
'Schleife ueber 3 Zeilen
For iCnt = 1 To 3
 'Daten aufnehmen
 arrDaten = Cells(iCnt, 1).Resize(1, Cells(iCnt, Columns.Count).End(xlToLeft).Column)
 'Ersetzen aufrufen, Daten uebergeben
 Call ERSETZEN2(arrDaten)
'Ende Schleife ueber 3 Zeilen
Next
'Meldung der vorgesehenen Ersetzungen ausgeben
MsgBox strmsg
End Sub

Sub ERSETZEN2(ByVal arrWechseln As Variant)
'Variablendeklarationen
Dim i As Long
'Dateiname in Meldung uebernehmen
strmsg = strmsg & arrWechseln(1, 1) & vbLf
'Schleife ueber alle Ersetzungen
For i = 2 To Ubound(arrWechseln, 2) Step 2
   'Ersetzung in meldungstext uebernehmen
   strmsg = strmsg & "Ersetze den Wert " & arrWechseln(1, i + 1) & " durch " & arrWechseln(1, i) & vbLf
'Ende Schleife ueber alle Ersetzungen
Next i
End Sub


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


Das mit dem Textstream muss auch nicht passen, wenn was mehrmals vorkommt und nur ein Treffer gewandelt werden soll. Schlimmstenfalls - für den gestreamten InStr Ansatz - bedeutet ID3 die ID aus Zeile 3... Nichts genaues weiß man nicht  Huh
Mal schauen, ob uns der TE genaueres mitteilt  :20:
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Hola Sabina!
Hola André!

Zuerst einmal möchte ich mich bei euch beiden für die kreativen Ansätze bedanken.

Dann möchte ich mich für meine unzureichende bzw. verwirrende TE entschuldigen.

Ich habe (natürlich auch) eine Excelliste mit VIER Spalten:

Dateipfad Dateiname ID Wert

C:\Users\Admin\Desktop\Folder\file1.html file1 qzDAR7yq London
C:\Users\Admin\Desktop\Folder\file2.html file2 VcHnwDqG Birmingham
C:\Users\Admin\Desktop\Folder\file3.html file3 TTCppCul Glasgow
C:\Users\Admin\Desktop\Folder\file4.html file4 SqK8MHft Liverpool
C:\Users\Admin\Desktop\Folder\file5.html file5 xczJ4PEr Bristol
C:\Users\Admin\Desktop\Folder\file6.html file6 j6AwiTON Manchester
C:\Users\Admin\Desktop\Folder\file7.html file7 qpAZTKWM Sheffield
C:\Users\Admin\Desktop\Folder\file8.html file8 2JeL3zYE Leeds
C:\Users\Admin\Desktop\Folder\file9.html file9 y5Ie7U2W Edinburgh
C:\Users\Admin\Desktop\Folder\file10.html file10 ul9tYiNN Leicester
usw.

Jede ID ist einzigartig und kommt über alle Dateien betrachtet auch nur einmal vor.

Es würde (doch) vollkommen ausreichen, wenn ich (in einem Durchlauf) in jeder Datei nur EINE ID gegen EINEN Wert austauschen kann:

Also zuerst in DATEI file1 die ID qzDAR7yq gegen den WERT London ersetze.
Danach in DATEI file2 die ID VcHnwDqG gegen den WERT Birmingham ersetze.
Danach in DATEI file3 die ID TTCppCul gegen den WERT Glasgow ersetze.
usw.

Dann könnte man ja in einem zweiten Schritt/Durchlauf in diesen Dateien andere ID`s gegen andere Werte austauschen:

Dateipfad Dateiname ID Wert
C:\Users\Admin\Desktop\Folder\file1.html file1 yW3yMAD0 Greater London
C:\Users\Admin\Desktop\Folder\file2.html file2 JVlexllw West Midlands
C:\Users\Admin\Desktop\Folder\file3.html file3 3bYHOwNg Glasgow
C:\Users\Admin\Desktop\Folder\file4.html file4 rlciA09T North West England
C:\Users\Admin\Desktop\Folder\file5.html file5 ZSPD36CP South West England
C:\Users\Admin\Desktop\Folder\file6.html file6 bYZKaNCD North West England
C:\Users\Admin\Desktop\Folder\file7.html file7 V13pj1b9 Yorkshire and the Humber
C:\Users\Admin\Desktop\Folder\file8.html file8 2BkYvXYn Yorkshire and the Humber
C:\Users\Admin\Desktop\Folder\file9.html file9 CVI0wOvL Edinburgh
C:\Users\Admin\Desktop\Folder\file10.html file10 y3U4LkUi East Midlands
usw.

Im ersten Schritt ersetze ich die ID`s durch Städte in UK, im zweiten Schritt füge ich die Regionen hinzu. So könnte man mehrere Durchläufe starten, auch mit weniger Dateien.

Dateipfad Dateiname ID Wert
C:\Users\Admin\Desktop\Folder\file1.html file1 AKJTHnvj England
C:\Users\Admin\Desktop\Folder\file2.html file2 3GLiqgqU England
C:\Users\Admin\Desktop\Folder\file4.html file4 8nxX44ka England
C:\Users\Admin\Desktop\Folder\file5.html file5 LsvasDzH England
C:\Users\Admin\Desktop\Folder\file7.html file7 RHsyhNMB England
C:\Users\Admin\Desktop\Folder\file10.html file10 E3sDcEph England
usw.

Dann spart man sich auch die komplexe Abfrage: "ID 3 und 4 in Datei 3 gegen Wert 3 und 4 usw."

Oder man kopiert alle Abfrageblöcke in Excel untereinander und die Werte werden der Reihe nach abgearbeitet und ersetzt.

Zum besseren Verständnis nachfolgend eine (verkürzte) Datei (file1.html):

Code:
<!DOCTYPE html>
<html>
<head>
<title>File1</title>
</head>
<body>

<h1>qzDAR7yq</h1>
<p>yW3yMAD0</p>
<p>AKJTHnvj</p>

</body>
</html>


Nach DREI Durchläufen (oder einem Durchlauf in dem Gesamtblock) sollte diese Datei (file1.html) dann so 

aussehen:

Code:
<!DOCTYPE html>
<html>
<head>
<title>File1</title>
</head>
<body>

<h1>London</h1>
<p>Greater London</p>
<p>England</p>

</body>
</html>


Jede Datei ist eine txt/html Datei. Alle Dateien liegen in EINEM Ordner OFFLINE auf meinem Rechner. 

Perfekt wäre eine Lösung mit der ich ebenso offline auf meinem Rechner arbeiten kann.

Peter
Top
#8
Hi Peter,

hier wäre der Code. Bitte lege eine Kopie der Daten an, falls etwas nicht passt.
Deine geposteten Daten sollten zeilenweise ab A1:D1 stehen und dann ohne Leerzeilen dazwischen untereinander. Drunter darf auch nichts mehr stehen. Die Dateioperationen sind jetzt mangels Dateien nicht getestet, die wollte ich nicht extra anlegen.

Arbeitsblatt mit dem Namen 'Tabelle1'
ABCD
1C:\Users\Admin\Desktop\Folder\file1.htmlfile1qzDAR7yqLondon
2C:\Users\Admin\Desktop\Folder\file2.htmlfile2VcHnwDqGBirmingham
3C:\Users\Admin\Desktop\Folder\file3.htmlfile3TTCppCulGlasgow
4C:\Users\Admin\Desktop\Folder\file4.htmlfile4SqK8MHftLiverpool
5C:\Users\Admin\Desktop\Folder\file5.htmlfile5xczJ4PErBristol
6C:\Users\Admin\Desktop\Folder\file6.htmlfile6j6AwiTONManchester
7C:\Users\Admin\Desktop\Folder\file7.htmlfile7qpAZTKWMSheffield
8C:\Users\Admin\Desktop\Folder\file8.htmlfile82JeL3zYELeeds
9C:\Users\Admin\Desktop\Folder\file9.htmlfile9y5Ie7U2WEdinburgh
10C:\Users\Admin\Desktop\Folder\file10.htmlfile10ul9tYiNNLeicester
Verwendete Systemkomponenten: [Windows (32-bit) NT 10.00] MS Excel 2016
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Option Explicit

Sub Ersetzen1()
'Variablendeklarationen
Dim iCnt%, arrDaten
Dim strMsg$
'Schleife ueber alle Zeilen
For iCnt = 1 To Cells(Rows.Count, 1).End(xlUp).Row
'Daten aufnehmen
arrDaten = Cells(iCnt, 1).Resize(1, 4)
'Makros zum Ersetzen aufrufen, Daten uebergeben
 strMsg = FileReadAll(arrDaten(1, 1))
 strMsg = Replace(strMsg, arrDaten(1, 3), arrDaten(1, 4))
 FileWriteAll arrDaten(1, 1), strMsg
'Ende Schleife ueber alle Zeilen
Next
'FertigMeldung ausgeben
MsgBox "Fertig!"
End Sub


Public Function FileReadAll(ByVal strFile As String) As String
'Wenn die Datei nicht existiert, dann Funktion verlassen
If Dir$(strFile, vbNormal) = "" Then Exit Function
'Variablendeklarationen
Dim sText$, iFi%
'Datei komplett einlesen
'freie Dateinummer ermitteln
iFi = FreeFile
'Datei binaer oeffnen
Open strFile For Binary As #iFi
'Einlesen
sText = Space$(LOF(F))
Get #iFi, , sText
'Datei schliessen
Close #iFi
'Text zurueckgeben
FileReadAll = sText
End Function

Public Sub FileWriteAll(ByVal strFile As String, ByVal strTxt As String)
'Variablendeklarationen
Dim iFi%
'Datei Inhalt überschreiben
'freie Dateinummer ermitteln
iFi = FreeFile
'Datei zum schreiben oeffnen
Open strFile For Output As #F
'ausgeben
Print #iFi, strTxt
'Datei schliessen
Close #iFi
End Sub



VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0

.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • PeterN
Top
#9
Hallo,

anbei die Datei.


Angehängte Dateien
.xlsm   CF_TextFileKomplettEinlesen_LOF_TextErsetzen.xlsm (Größe: 17,26 KB / Downloads: 3)
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • PeterN
Top
#10
Hallo,

Du kannst mit den Entwicklertools Buttons einfügen. Die Entwicklertools sind ein ausgeblendetes Menü. Gehe oben auf "Weitere befehle" dann "Menüband anpassen" und dann rechts in der Liste aktivierst Du die Entwicklertools. Im neuen Menüband kannst DU dann über "Einfügen" einen Button einfügen und dem ein Makro zuweisen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste