Bitte schön:
use strict;
use English;
my $filename = "";
if (not defined @ARGV ) {
print STDERR "Usage: " . $PROGRAM_NAME . " FILENAME\n";
exit;
}
open(IN, $ARGV[0] ) or die "Lesefehler '" . $ARGV[0] . "'! Grund: $!\n";
while(<IN>) {
if( /\<a\s+name\s*=\s*\"(.*?)\"\s*\>/i ) {
$filename = cleanup($1) . ".html";
if( $filename ne "") {
close(OUT);
}
print STDERR "Neuer Filename: $filename\n";
open(OUT, ">$filename") or die "Schreibfehler '$filename'! Grund: $!\n";
} else {
print OUT $_ if($filename ne "");
}
}
close(OUT) if($filename ne "");
close(IN);
sub cleanup {
my $text = shift @_;
$text =~ s/[\s,;]/_/gi;
$text =~ s/[:\\\/\"']/-/gi;
return($text);
}
Sehr freundlich.
Das hat mir jetzt auf jeden Fall weitergeholfen.
Es scheint noch ein kleines Problem zu geben:
-> Der beginnt erst mit der ersten Zeile nach dem gefundenen <a\s+name\s*=\s*\"(.*?)\"\s*\>
Am Anfang eines Abschnittes wird aus:
<h3 style='margin-left:0cm;text-indent:0cm'><a name="_Toc131827276">2.9.1<span
style='font:7.0pt "Times New Roman"'> </span>Buchungsjournale</a></h3> etc.
das hier:
style='font:7.0pt "Times New Roman"'> </span>Buchungsjournale</a></h3> etc.
Falls sich jemand dafür interessiert: Über Activestate.com ist Perl umsonst und sehr schnell auf Windowsrechnern installiert.
Gruß Axel
Soda, jetzt wird die Zeile mit dem "<a name ..." auch ins File geschrieben:
use strict;
use English;
my $filename = "";
if (not defined @ARGV ) {
print STDERR "Usage: " . $PROGRAM_NAME . " FILENAME\n";
exit;
}
open(IN, $ARGV[0] ) or die "Lesefehler '" . $ARGV[0] . "'! Grund: $!\n";
while(<IN>) {
if( /\<a\s+name\s*=\s*\"(.*?)\"\s*\>/i ) {
$filename = cleanup($1) . ".html";
if( $filename ne "") {
close(OUT);
}
print STDERR "Neuer Filename: $filename\n";
open(OUT, ">$filename") or die "Schreibfehler '$filename'! Grund: $!\n";
}
print OUT $_ if($filename ne "");
}
close(OUT) if($filename ne "");
close(IN);
sub cleanup {
my $text = shift @_;
$text =~ s/[\s,;]/_/gi;
$text =~ s/[:\\\/\"']/-/gi;
return($text);
}
Tidy habe ich mir auch schon überlegt. Ich bekomme damit aber nicht so etwas wie:
<span style='font:7.0pt "Times New Roman"'>
</span>
weg. Selbst wenn ich den vorhandenen Word 2000 Flag einschalte (benutze Tidy GUI).
Vielleicht kenne ich mich auch zu wenig mit Tidy aus. Aber imho kann man damit nicht einfach Tags entfernen.
Beispieldatei hänge ich in der nächsten Stunde hier an.
Gruß Axel
Soda, damit sollte es klappen:
use strict;
use English;
my $filename = "";
if (not defined @ARGV ) {
print STDERR "Usage: " . $PROGRAM_NAME . " FILENAME\n";
exit;
}
open(IN, $ARGV[0] ) or die "Lesefehler '" . $ARGV[0] . "'! Grund: $!\n";
while(<IN>) {
if( /\<a\s+name\s*=\s*\"?(.*?)\"?\s*\>/i ) {
$filename = cleanup($1) . ".html";
if( $filename ne "") {
close(OUT);
}
print STDERR "Neuer Filename: $filename\n";
open(OUT, ">$filename") or die "Schreibfehler '$filename'! Grund: $!\n";
}
s#(?s)( class=\w+(?=([^<]*>)))|(<!--\[if.*?<!\[endif\]-->)|(<!\[if !\w+\]>)|(<!\[endif\]>)|(<o:p>[^<]*</o:p>)|(<span[^>]*>)|(</span>)|(font-family:[^>]*[;'])|(font-size:[^>]*[;'])(?-s)##gi;
print OUT $_ if($filename ne "");
}
close(OUT) if($filename ne "");
close(IN);
sub cleanup {
my $text = shift @_;
$text =~ s/[\s,;]/_/gi;
$text =~ s/[:\\\/\"']/-/gi;
return($text);
}
Ich hab auch die Erkennung für den "<a name=..." so geändert, dass es auch ohne " um den Attributwert funktioniert. Ist zwar nicht Standardkonform, aber Word generiert solche Tags. :(
Known Bug: Ich lese das File Zeiel für Zeile ein, der Word-Demoronizer erkennt daher ev. nicht jeden Word-Schwachsinn. Falls das ein Problem sein sollte, gib bescheid, dann bau ich es um.
Attachment von txt in .html umbenennen.
Pfade in c# code sind hartcodiert.
So. Konnte mich dem nun nach längerer Zeit wieder widmen.
Ein paar Dinger gab es da noch.
Die konnte ich aber mit Hilfe dieses C# codes erstmal beheben.
Das angehängte File ist ein solcher "Problemfall". Es sollte relativ offensichtlich sein, was mit dem C# code transformiert wird (und somit vorher anders war als erwünscht).
Nix gegen Martin (war eine große Hilfe). Ich habe auch die Infos sehr tröpfchenweise herausgelassen.
Ich hab erstmal mit Java Regex angefangen. Angesichts dieses Beispiels war dann aber C# einfacher (http://tim.mackey.ie/CleanWordHTMLUsingRegularExpressions.aspx)
Ich arbeite allerdings noch an entsprechenden Java Code und hab schon Regex mit NIO am Laufen.
Poste hierzu später.
Hört sich chaotisch an? Yes. Indeed. Sorry.
Axel
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Encoding encode = Encoding.GetEncoding("ISO-8859-1");
//Console.WriteLine(new Program().CleanHtml("<SPAN lang=EN-IE style=\"mso-ansi-language: EN-IE\">"));
FileStream file = new FileStream("C://perlMy//Version_4//_Toc134343703.html", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(file, encode);
String inRead = sr.ReadToEnd();
String res = new Program().CleanHtml(inRead);
FileStream fileNew = new FileStream("C://perlMy//Version_4//zz.html", FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fileNew, encode);
sw.Write(res);
sw.Close();
sr.Close();
Console.WriteLine(res);
}
private string CleanHtml(string html)
{
// start by completely removing all unwanted tags
html = Regex.Replace(html, @"<[/]?(font|span|xml|del|ins|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase);
// then run another pass over the html (twice), removing unwanted attributes
html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^>]+)([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
return html;
}
}
}
Geh jetzt erstmal suchen, wie ich mit C# alle Dateien eines Verzeichnisses verarbeite.