jaeger1983
Goto Top

Mehrere Dateien laden und eine Tabelle aus diesen in neuen Dateien übergeben

Hallo zusammen,

folgendes Problem habe ich und hoffentlich könnt Ihr mir helfen.

Ich habe ca. 500 Textdateien von unserer Website in einem Ordner exportiert. Die Dateien haben völlig unterschiedliche Dateinamen. Nun ist es so, dass der gesamte HTML-Code mit übernommen wurden und sich in den Export-Einstellungen nichts anpassen lässt. Die Datei besteht aus Text und einer einzigen Tabelle die benötigt wird.

Als Beispiel

<!DOCTYPE html>
<html lang="DE">
<head>
<meta content="text/html;
...
<table ....
...Daten...
...Daten...
</table>

In den Dateien kommt das <table>/</table> nur ein mal vor. Gibt es eine Möglichkeit per Batch oder einem Freeware-Tool den Teil zwischen <table> und </table> automatisiert auszulesen und in einzelne Textdateien schreiben zu lassen?

Schon mal vielen Dank für Eure Hilfe!

Content-ID: 220912

Url: https://administrator.de/forum/mehrere-dateien-laden-und-eine-tabelle-aus-diesen-in-neuen-dateien-uebergeben-220912.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

rubberman
rubberman 01.11.2013 aktualisiert um 01:16:51 Uhr
Goto Top
Hallo Jaeger1983, willkommen im Forum.

Batch ist technisch ungeeignet um HTML Quelltext zu verarbeiten. Batch arbeitet Textdateien zeilenweise ab, wobei die Stringlänge auf 8191 Zeichen beschränkt ist. HTML braucht grundsätzlich gar keinen Zeilenumbruch und könnte theoretisch in einer einzigen Zeile mit unbestimmter Länge vorliegen.

Dein Vorhaben ließe sich mit einem Script umsetzen, das Reguläre Ausdrücke unterstützt. Dazu fehlt aber einiges an Zusatzinformationen.
  • Liegen alle Dateien im selben Verzeichnis?
  • Haben sie alle die gleiche Dateiendung und wenn ja, welche (oder wie sonst sollen die zu verarbeitenden Dateien identifiziert werden)?
  • Sind die table-Tags selbst Bestandteil der benötigten Daten, oder nur der HTML Text, der in sie eingeschlossen ist?
  • Sollen die ausgelesenen Daten in die gleichen Dateien zurückgeschrieben werden oder in andere Dateien (falls in andere, wohin und mit welcher Nomenklatur)?

Grüße
rubberman
certifiedit.net
certifiedit.net 01.11.2013 um 01:26:04 Uhr
Goto Top
Ich würde das gerne Ergänzen: Wie ist die bisherige Site aufgebaut? besteht ggf. die Möglichkeit die Daten direkt aus einer DB (MYSQL?) heraus zu ziehen?
Jaeger1983
Jaeger1983 01.11.2013 um 09:40:53 Uhr
Goto Top
Danke für die schnellen Antworten!

rubberman:
- die Daten liegen in einem Verzeichnis
- gleiche Dateiendung .html
- die Table Tags sind selbst Bestandteil
- in eine andere Datei, html wäre vollkommen in Ordnung

certifiedit:
Leider nein, wenn ich die Daten habe, dann kommen diese aber direkt in eine DB, damit ich nicht irgendwann wieder vor diesem Problem stehe.

Gruß
Jaeger1983
certifiedit.net
certifiedit.net 01.11.2013 um 10:28:42 Uhr
Goto Top
Zitat von @Jaeger1983:
Danke für die schnellen Antworten!

rubberman:
- die Daten liegen in einem Verzeichnis
- gleiche Dateiendung .html
- die Table Tags sind selbst Bestandteil
- in eine andere Datei, html wäre vollkommen in Ordnung

certifiedit:
Leider nein, wenn ich die Daten habe, dann kommen diese aber direkt in eine DB, damit ich nicht irgendwann wieder vor diesem
Problem stehe.

Gruß
Jaeger1983

OK, aber warum wird man hier wegen einer Anmerkung herunter bewertet, die dir ggf. enorm Zeit gespart hätte?
Jaeger1983
Jaeger1983 01.11.2013 aktualisiert um 10:36:37 Uhr
Goto Top
Zitat von @certifiedit.net:
> Zitat von @Jaeger1983:
> ----

OK, aber warum wird man hier wegen einer Anmerkung herunter bewertet, die dir ggf. enorm Zeit gespart hätte?

Kann ich Dir nicht beantworten.
rubberman
rubberman 01.11.2013 aktualisiert um 10:51:00 Uhr
Goto Top
@certifiedit
Ich war's auch nicht, ich fand die Frage durchaus gerechtfertigt.

@Jaeger1983
Bin auf Arbeit und habe nicht die Zeit das jetzt zu erledigen. Wenn's ordentlich werden soll, werde ich das heute Abend schreiben. Ist kein riesiger Aufwand ...
Nur noch eine Rückfrage: Soll alles in eine Datei oder für jede Tabelle eine neue?

Grüße
rubberman
Jaeger1983
Jaeger1983 01.11.2013 um 11:26:15 Uhr
Goto Top
Danke rubberman, es wäre schön, wenn ich pro Tabelle eine Datei hätte.
Endoro
Endoro 01.11.2013 um 15:32:44 Uhr
Goto Top
Hi, hier das Beispiel einer Lösung mit sed for Windows.
Wenn die Tabellentags mit übertragen werden sollen:
sed -ni.bak "/<table/,/<\/table/p" *.html  
und ohne Tags:
sed -ni.bak "/<table/,/<\/table/{//!p}" *.html  
lg.
rubberman
rubberman 01.11.2013 um 15:53:24 Uhr
Goto Top
Hallo Jaeger1983,

Einzeiler wie Endoro kann ich nicht bieten. Wenn es ohne 3rd-Party-Tool sein soll, hätte ich hier ein VBScript:

*.vbs
Option Explicit

Const strFolder = "C:\pfad\zu\dateien"  
Const strPrefix = "Table_"  

Const ForReading = 1
Const ForWriting = 2
Dim objFSO, objFolder, objFile, objFileNew, objStream, objRegEx, colMatches
Dim strContent, strFileNew

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFolder = objFSO.GetFolder(strFolder)
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "<table>.*\s*</table>"  


For Each objFile In objFolder.Files
  If StrComp(objFSO.GetExtensionName(objFile.Name), "html", vbTextCompare) = 0 _  
   And objFile.Size > 0 _
   And Left(objFile.Name, Len(strPrefix)) <> strPrefix Then
    Set objStream = objFile.OpenAsTextStream(ForReading)
    strContent = objStream.ReadAll
    objStream.Close
    If objRegEx.Test(strContent) Then
      Set colMatches = objRegEx.Execute(strContent)
      strFileNew = objFSO.BuildPath(strFolder, strPrefix & objFile.Name)
      Set objFileNew = objFSO.OpenTextFile(strFileNew, ForWriting, True)
      objFileNew.Write colMatches(0)
      objFileNew.Close
    End If
  End If
Next
strFolder anpassen und los gehts.

Grüße
rubberman
Jaeger1983
Jaeger1983 01.11.2013 um 20:49:37 Uhr
Goto Top
Hallo rubberman,

vielen vielen Dank für die schnelle Hilfe!

Die 500 Dateien sind fertig. Nun habe ich festgestellt, dass es weitere 2000 Dateien in einer Ordnerstruktur gibt. Bei den weiteren Dateien ist das Problem, dass der Beginn der Tabelle mit <table width="100%" ....> beginnt.

Gibt es die Möglichkeit, dass das gesamte Verzeichnis durchsucht wird und die Dateien am "Fundort" abgelegt werden.

Sorry, bin durch Zufall an die Daten gekommen face-sad
rubberman
rubberman 01.11.2013 aktualisiert um 21:55:58 Uhr
Goto Top
Hallo Jaeger1983,

als hätte ich den Braten nicht bereits im Vorfeld gerochen face-wink
Option Explicit

Const strFolder = "C:\pfad\zu\dateien"  
Const strPrefix = "Table_"  

Const ForReading = 1
Const ForWriting = 2
Dim objFSO, objRegEx

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "<table.*\s*</table>"  
ProcessFiles strFolder

Sub ProcessFiles(strPath)
  Dim objFolder, objSubFolder, objFile, objFileNew, objStream, colMatches
  Dim strContent, strFileNew
  Set objFolder = objFSO.GetFolder(strPath)
  For Each objSubFolder In objFolder.SubFolders
    ProcessFiles objSubFolder.Path
  Next
  For Each objFile In objFolder.Files
    If StrComp(objFSO.GetExtensionName(objFile.Name), "html", vbTextCompare) = 0 _  
     And objFile.Size > 0 _
     And Left(objFile.Name, Len(strPrefix)) <> strPrefix Then
      Set objStream = objFile.OpenAsTextStream(ForReading)
      strContent = objStream.ReadAll
      objStream.Close
      If objRegEx.Test(strContent) Then
        Set colMatches = objRegEx.Execute(strContent)
        strFileNew = objFSO.BuildPath(strPath, strPrefix & objFile.Name)
        Set objFileNew = objFSO.OpenTextFile(strFileNew, ForWriting, True)
        objFileNew.Write colMatches(0)
        objFileNew.Close
      End If
    End If
  Next
End Sub
Grüße
rubberman
Jaeger1983
Jaeger1983 01.11.2013 um 22:43:29 Uhr
Goto Top
Hallo rubberman,

danke für die schnelle Rückmeldung.

Ich habe jetzt mit diesen alten Daten mal getestet. Hier funktionieren beide Varianten nicht. Kann das mit dem Code zusammenhängen der zwischen <table... und </table> steht? Bei den 500 war rein nur <table ...> Daten </table>. Bei den 2000 ist da noch nen Script mit drin.
rubberman
rubberman 01.11.2013 um 23:15:52 Uhr
Goto Top
Das ist unmöglich von hier aus zu sagen. Ich kenne den Inhalt deiner HTML Dateien nicht. Deine ursprüngliche Aussage war
Die Datei besteht aus Text und einer einzigen Tabelle die benötigt wird.
Sind es nun mehrere Tabellen, zwischen denen sich ein Script befindet?
Analysiere erst mal deine Dateien ...

Grüße
rubberman
rubberman
rubberman 02.11.2013 um 00:11:12 Uhr
Goto Top
Ups, wo ist denn deine Antwort von eben hin face-big-smile

Egal, teste mal mit folgendem Pattern:
objRegEx.Pattern = "<table[\s\S]*?</table>"
Grüße
rubberman
Jaeger1983
Jaeger1983 02.11.2013 um 00:16:45 Uhr
Goto Top
Hallo rubberman,

vielen Dank! Jetzt funktioniert es, 1000 Dank!

Gruß
Jaeger1983