gurkenhobel
Goto Top

Dateien eines Ordners auslesen und in Protokolldatei speichern

Hallo Gemeinschaft,
schon wiedereinmal stehe ich vor UNENDLICHEN SCHWIERIGKEITEN. Ich möchte von jeder der ca.1200 Dateien eines Ordners die zwölfte Zeile auslesen und den Text in eine Protokolldatei schreiben. Davor (oder danach) soll der jweilige Dateiname stehen. Ich habe zwei vorhandene Scripts zusammengefügt, bekomme aber in Zeile 7 immer eine Fehlermeldung (Typenkonflikt).

Set oFSO = createobject("Scripting.FileSystemObject")  
Sub Listordner(ordner)
Set ordner = oFSO.getfolder(ordner)

For Each file In ordner.files

Set oFile = oFSO.OpenTextFile(ordner.files, 1)
 for i = 1 to 12
 strLine = oFile.Readline ' 12. Zeile auslesen  
next
Stelle=Instr(strLine,"</h1>")-73  
Ortsname = mid(strLine, 73,Stelle) & " "  
oFile.Close

 liste = liste & file.path & Ortsname & vbCr
 Next
For Each unterordner In ordner.subfolders
 liste = liste & unterordner.path & vbCr
 Listordner unterordner
 Next
End Sub

Ordner ="." ' aktueller Ordner  
Listordner ordner
Set logbuch = fs.opentextfile("inhalt.txt", 8, true,0)  
Logbuch.writeline liste
Logbuch.close

Ich weiß nimmer weiter und würde mich über Hilfe sehr freuen.
Abendliche Grüße

Content-Key: 245119

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

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: An-dir
Lösung An-dir 30.07.2014, aktualisiert am 01.08.2014 um 11:45:22 Uhr
Goto Top
Hallo Gurkenhobel

ich hab es mir so weit wie möglich abgewöhnt die alten Skripte zu verwenden und nutze lieber Powershell.

$output = ""
$Files = dir "c:\Dein Ordner"
Foreach ($File in $Files) {
$output += "`n`n`t==== $($File.Fullname) ====`n"
$output += (gc ($File.Fullname))[11]
}
$output | Out-File inhalt.txt

Aber wenn ich das richtig sehe, willst du HTML files einer Datenbank parsen. Soetwas ähnliches hab ich auch schon mal mit Powershell realisiert und da gibt es sehr viele gute Lösungen.

Gruß
Andi
Mitglied: bastla
bastla 30.07.2014 aktualisiert um 22:53:39 Uhr
Goto Top
Hallo Gurkenhobel!

Ändere Zeile 7 auf
Set oFile = oFSO.OpenTextFile(file.Path)
oder kürzer
Set oFile = oFSO.OpenTextFile(file)
Grüße
bastla
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 12:01:55 Uhr
Goto Top
Danke Andi,
aber mit der Powershell habe ich nichts am Hut - kenne mich da rein gar nicht aus. In WSH (VBS) kenne ich wenigstens ein paar Grundzüge
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 12:20:41 Uhr
Goto Top
@bastla
Nach Änderung der Zeile 7 bekomme ich in Zeile 11 den Fehler: "Eingabe hinter Dateiende". Nun habe ich in einer Schleife elf Zeilen übersprungen, bekomme aber immer noch den gleichen Fehler

Zeilen 7 bis 14
Set oFile = oFSO.OpenTextFile(file.Path)
' Set oFile = oFSO.OpenTextFile(file)  

for i=1 to 11
 oFile.Skipline ' Fehler: Eingabe hinter Dateiende  
next

strLine = oFile.Readline ' 12. Zeile auslesen  
...

Was kann man tun ?
Mitglied: bastla
bastla 31.07.2014 um 12:48:02 Uhr
Goto Top
Hallo Gurkenhobel!

Auf das Dateiende kannst Du mit
If oFile.AtEndOfStream Then
testen und entsprechend reagieren ...

Grüße
bastla
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 15:24:49 Uhr
Goto Top
Hallo bastla
WO soll ich denn die IF-Abfrage einbauen ? JEDE der Dateien im Ordner hat ja 25 Zeilen. Außerdem klappt es bei einer Abrage nach einzelnen Dateien ja auch:
Set oFSO = CreateObject("Scripting.FileSystemObject")  
Eingabe=Inputbox("Ihre Eingabe:")  
Set oFile = oFSO.OpenTextFile(Eingabe, 1)
for i=1 to 11
 oFile.Skipline ' 11 Zeilen überspringen  
next
strLine = oFile.Readline ' 12. Zeile  
Stelle = Instr(strLine,"</h1>")-73  
Wert = Eingabe & " " & mid(strLine, 73, Stelle)  
Set Protokoll = oFSO.opentextfile("Protokoll.txt", 8, true, 0) ' Daten anhängen ...  
 Protokoll.writeline Wert
 Protokoll.close
oFile.Close

Grüße G:H
Mitglied: bastla
bastla 31.07.2014 um 15:33:07 Uhr
Goto Top
Hallo Gurkenhobel!

Einbauen müsstest Du die Abfrage vor jedem Lesezugriff (das wären die Zeilen 5 und 7); warum der Fehler auftritt, kann ich mir allerdings auch nicht erklären ...

Grüße
bastla
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 16:31:23 Uhr
Goto Top
Hallo bastla,
herumexperimentiert und ausprobiert, aber trotz
Set oFile = oFSO.OpenTextFile(file.Path)
' Set oFile = oFSO.OpenTextFile(file)  
If oFile.AtEndOfStream Then ' --------------  
 oFile.Close
 Set oFile = Nothing
 Exit Sub
End If
Kommt der Fehler immer noch...
Ich weiß nicht mehr weiter Ѿ
Grüße
Mitglied: An-dir
An-dir 31.07.2014 aktualisiert um 16:37:30 Uhr
Goto Top
Dann versuch dich doch mal an powershell. Du kannst den code einfach in eine Powershell rein kopieren und schon hast du das Ergebnis auf deinem Desktop.

$InputFolder = "C:\testfileline12" # Pfad zu dem Ordner mit den einzulesenden Dateien  
$OutputFile = "$env:userprofile\desktop\inhalt.txt" # Pfad zur Ausgabedatei - Momentan wäre es der Desktop  

$output = "" # Temporäre Variable  
$Files = dir $InputFolder # Dateien im Ordner ermitteln
Foreach ($File in $Files) {
$output += "`r`n`r`n`t==== $($File.Fullname) ====`r`n" # trennzeilen mit vollständigem Namen als Überschrift (Alternativ "Fullname" durch "Name" ersetzen)  
$output += (gc ($File.Fullname))[11] # Inhalte der Dateien
}
$output | Out-File $OutputFile


Gruß
Andi
Mitglied: bastla
bastla 31.07.2014 um 16:42:26 Uhr
Goto Top
Hallo Gurkenhobel!

Wie gesagt - warum es überhaupt zu dem Fehler kommt, weiß ich auch nicht; platzieren müsstest Du die Abfrage aber natürlich innerhalb der Schleife und damit vor jedem einzelnen Lesezugriff ...

Grüße
bastla
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 17:15:54 Uhr
Goto Top
@An-dir
Danke,
habe die Powershell ISE (x86) aufgerufen, das Script angepasst und abgespeichert.
Ausgeführt wurde es nicht - da die Datei "I:\Statistik\Deutschland\...\auslesen.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen erhalten Sie mit "get-help about_signing". Beim Aufurf von "get-help about_signing" kommt ein urig langer Text zur Signierung. Was kann ich weiter tun ?
Grüße
Mitglied: An-dir
An-dir 31.07.2014 um 17:31:06 Uhr
Goto Top
Du kannst die Befehle auch einfach rein kopieren. Mehrzeile Befehle gehen auch ohne Probleme. Am Ende musst du nur noch einmal die Eingabe taste drücken.

Wenn du die PS1 Datei ausführen willst, dann kannst du in eine Powershell die mit Adminrechten gestartet wird den Befehl "Set-ExecutionPolicy Unrestricted" einfügen und dann alle ps1 skripte ohne prüfung ausführen (http://technet.microsoft.com/de-de/library/ee176961.aspx)
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 18:35:34 Uhr
Goto Top
Danke, soweit lief es ganz gut. Habe die Zeile 7 geändert auf
$output += "`r`n$($File.Name): `t"  

und bekomme dafür folgendes Resultat:
...
117.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Haslach </h1>  
118.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Herrenberg </h1>  
119.php: 	<img src="../css/LEO-BW-logo.png" width="70"><h1>Geschlechterverteilung: Kayh </h1>  
...
wie bekomme ich die unerwünschten Zeichen zwischen <img src..> und "Geschlechterverteilung: " bzw. das </h1> weg ?
Grüße
Mitglied: An-dir
An-dir 31.07.2014 aktualisiert um 19:05:34 Uhr
Goto Top
Freut mich dass du schon gut vorankommst face-smile

wenn du es einfach willst, dann könntest du split verwenden.

($Variable.split(":"))[1].split("<")

Damit sollte das Ergebnis dann so aussehen:
117.php: Haslach
118.php: Herrenberg
119.php: Kayh

Falls du dann auftretende Leerzeichen am Anfang und am Ende entfernen möchtest, dann einfach ".trim()" anfügen.
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 19:25:05 Uhr
Goto Top
...
und wo soll das
($Variable.split(":"))[1].split("<")  
hinein, hab's ergebnislos in drei Zeilen probiert...
Mitglied: An-dir
An-dir 31.07.2014 aktualisiert um 19:39:15 Uhr
Goto Top
Sorry face-smile

Du hast ja meinen Code einwenig umgebaut und jetzt hab ich zu viel gefordert.

in der Zeile einfach so: $output += ((gc ($File.Fullname))[11].split(":"))[1].split("<")
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 20:33:15 Uhr
Goto Top
Hallo An-dir,
ja das Ergebnis sieht ganz passabel aus und ich glaube, wir können das so lassen.
Danke für den Minikurs in Power-Shell, und noch einen schönen Abend
GѾH
Mitglied: An-dir
An-dir 31.07.2014 um 21:20:08 Uhr
Goto Top
Freut mich dass ich dir helfen konnte und vielleicht die PowerShell etwas näher bringen konnte.
Die Frage könnte dann ja als gelöst markiert werden.
Mitglied: Gurkenhobel
Gurkenhobel 31.07.2014 um 21:36:27 Uhr
Goto Top
@bastla
habe immer das letzte Wort. Hier noch eine modifiziertes Script mit Unterprogramm - es funktioniert auch.
Dim objFso, strFolder, Logbuch

' ------------ Beginn Hauptprogramm  

Set objFso = CreateObject("Scripting.FileSystemObject")  
strFolder = objFso.GetParentFolderName(WScript.ScriptFullName) ' nur der Ordnername  

If objFso.FolderExists(strFolder) Then
 Call GetPHPFiles(objFso.GetFolder(strFolder))
End If

Set objFso = Nothing

' ----------- Ende Hauptprogramm  

Sub GetPHPFiles(ByRef objFolder)
Dim objFile, objSubFolder
 For Each objFile In objFolder.Files
  If LCase(objFso.GetExtensionName(objFile.Name)) = "php" Then  
   Call PHPRead(objFile)
  End If
 Next
 For Each objSubFolder In objFolder.SubFolders
  Call GetPHPFiles(objSubFolder)
 Next
End Sub

Sub PHPRead(ByRef objFile)
 Dim arrText, strText, strTextLine, objPHPFile, intPosition1, intPosition2
 Set objPHPFile = objFso.OpenTextFile(objFile.Path)
 arrText = Split(objPHPFile.ReadAll, vbCrLf)
 objPHPFile.Close
 For Each strTextLine In arrText
  If strTextLine <> "" Then  
   strText = Trim(strTextLine)
   intPosition1=Instr(1,strText,"</title>") '</title> kommt eher als </H1> vor  
   intPosition2 = InStr(1, strText, "Geschlechterverteilung: ", vbTextCompare) + 24  
    Ortsname = objFile.name & vbTab & Mid(strText, intPosition2, intPosition1-intPosition2)
   End If
  End If
 Next

' Jetzt in Datei schreiben...  
Set logbuch = objFSO.opentextfile("Dateiliste.txt", 8, true,0) ' Neue Daten werden angehängt ...  
 Logbuch.writeline Ortsname
 Logbuch.close
End Sub

Schönen Abend allen und Schluss