guten morgen
ich such ne möglichkeit eine mir vorliegende html datei (hat viel orte mit postleitzahlen ) in eine csv datei zu wandeln. hab jetzt nicht so direkt ne ahnung wie ich da ran gehn soll 😉
Hallo molta!
Eine Html Datei in CVS? Das hab ich noch nie gesehen.
Aber möglich ist es. Da bräuchten wir jedoch etwas mehr detailinformationen über die Html-Datei.
Grundsätzlich kannst Du abr so vorgehen:
Ich gehe davon aus, dass Du nur bestimmte Daten aus dieser HTML-Datei haben möchtest. Diese solltest Du zunächst lokalisieren und dann separieren (String-Suche und ausschneiden).
Danach solltest Du die Html-Tags einzeln zu jedem Datensatz lokalisieren, und diese ausschneiden. Danach kommen die Daten an sich dran, da auch die Html-Tags entfernen, Daten auslesen und in einem separaten File abspeichern.
Wenn ich Dir dazu genauer helfen soll, dann wäre es besser, mal einen kleinen Ausschnitt aus der HTML-Datei zu sehen, und dann von Dir beschrieben, an welche Daten Du denn gerne dran kommen möchtest...
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
also so schaut zb eine der html dateien aus (hab davon mehrer und muss halt jede umwandeln )
HTML DATEI :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)[URL]http://www.uni-heidelberg.de/sonstiges/lb/0/06/06201.html[/URL] -->
<HTML><HEAD><TITLE>06201 Merseburg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
<META content="MSHTML 6.00.2800.1522" name=GENERATOR></HEAD>
<BODY><XMP>06217 Merseburg
06217 Atzendorf
06217 Bloesien
06217 Geusa
06217 Gut Werder
06217 Merseburg
06217 Meuschau
06217 Trebnitz
06217 Zscherben
06231 Bad Duerrenberg
06231 Ellerbach
06231 Kauern
06231 Koetzschau
06231 Kreypau
06231 Nempitz
06231 Oebles-Schlechtewitz
06231 Pissen
06231 Ragwitz
06231 Rampitz
06231 Rodden
06231 Schladebach
06231 Thalschuetz
06231 Tollwitz
06231 Witzschersdorf
06231 Woelkau
06231 Wuesteneutzsch
06231 Zoellschen
06237 Leuna
06237 Kroellwitz
06237 Leuna
06237 Spergau
06242 Braunsbedra
06242 Braunsbedra
06242 Grosskayna
06242 Krumpa
06242 Leiha
06242 Nahlendorf
06242 Neumark
06242 Rossbach
06242 Schortau
06242 Rossbach (92) Lunstaedt
06246 Bad Lauchstaedt
06246 Bad Lauchstaedt
06246 Buendorf
06246 Delitz
06246 Doerstewitz
06246 Grossgraefendorf
06246 Klobikau
06246 Knapendorf
06246 Milzau
06249 Muecheln
06254 Guenthersdorf
06254 Doelkau
06254 Friedensdorf
06254 Goehren
06254 Guenthersdorf
06254 Horburg
06254 Koetschlitz
06254 Loepitz
06254 Loessen
06254 Luppenau-Tragarth
06254 Masslau
06254 Moehritzsch
06254 Wallendorf
06254 Zoeschen
06254 Zschoechergen
06254 Zweimen
06255 ?
06255 Niederwuensch
06255 Oberwuensch
06255 Schafstaedt
06255 Unterwuensch
06258 Schkopau
06258 Kollenbey
06258 Korbetha
06258 Schkopau
06259 ?
06259 Beuna
06259 Frankleben
06259 Reipisch
</XMP><A href="http://www.uni-heidelberg.de/sonstiges/lb/0/06/index.html">Up</A>
</BODY></HTML>
in meiner csv datei soll dann die ersten zeilen zb so ausschaun:
PLZ;Hauptort;Nebenort
06217;Merseburg;
06217;Merseburg;Atzendorf
06217;Merseburg;Bloesien
.
.
.
.
06231;Bad Duerrenberg;
06231;Bad Duerrenberg;Ellerbach
.
.
.
Wenn es sich um XHTML handelt, dann wäre das eine typische Aufgabe für XSLT.
Doctype ist HTML 4.0, also erstmal kein XHTML, aber es scheint XHTML-konform zu sein. XHTML ist echtes XML, während "normales" HTML auch gerne mal verstümmelt ist (z.B. keine schließenden Tags). Peilen zwar die Browser meist, ist aber für XSLT nicht geeignet, weil das eben XML vorraussetzt. Wichtig ist eben, dass das HTML der XML-Wohlgeformtheit entspricht.
also hab mir das mit dem xslt mal angeschaut und ich peils irgendwie nicht so recht 🤔
ich würd mir das jetzt einfach selber zerlegen und aufbauen wie norman_timo vorgeschlagen hat.
nun ist das problem aufgetreten das ich bei nem .Split(spliter ) die variable spliter ja char [] sein muss. für mich wärs aber viel weniger arbeit wenn ich mithilfe von strings splitten könnte also zb "<xmp>" damit ich im ersten schritt alles weghaun kann was ich sowieso nicht brauch
Beim zweiten Hinsehen würde ich sagen, XSLT ist doch keine gute Wahl. Die eigentlichen Daten sind ja nicht XML-strukturiert, hatte ich übersehen.
Wenn es gültiges Xml ist, würde ich im ersten Schritt die XMP-Elemente als Ganzes auslesen - mit einem XmlReader oder als XmlDocument. Der Text im XMP-Element kann dann mit String.Split oder besser Regex.Split weiter aufgesplittet werden. String.Split macht Probleme, wenn gleiche Trennzeichen aufeinander folgen, z.B. mehrere Leerzeichen.
Split-Regex: @"\s*\r?\n\s*"
Trennt an Zeilenumbrüchen und entfernt gleich führende und nachfolgende Whitespaces.
Gruss Pulpapex
ist kein xml sondern html
ich bastel mir das nun stück für stück zusammen. ist zwar keine schöne lösung aber besser als nichts
Stimmt,
bei den Meta-Tags fehlt das Tag-Ende.
Dann könnte man noch mit 2 verschiedenen Regexes extrahieren.
@"<XMP>([^<]*)</XMP>" - zum Finden des XMP-Textes (Gruppe 1).
@"\s*\r?\n\s*" - wie gehabt zum Splitten.
mit Regex.Matches(dein Regex für die plz mit name) kriegst du eine Matchcollection. Gehe durch die durch mit foreach und schreib dein csv file.
Gruss,
.unreal
mir ist beim zweiten html file aufgefallen das nicht das selbe wie beim ersten ist und da noch irgendwelche zahlen drin waren die ich nicht gebraucht habe. naja habs nun aber doch hinbekommen die 700 html files zu convertieren
der code is zwar schwer zu lesen aber ich post den trotzdem mal rein
static void Main(string[] args)
{
Class1 db = new Class1();
string path1 = "C:\\Dokumente und Einstellungen\\fneueder\\Eigene Dateien\\postleitzahlen\\Names.txt";
object[]names=db.LoadFileNames(path1);
int i,j,k,l=0,m=0,n=0,o=0,p=0,z=0,x;
for (i=0;i<names.Length;i++)
{
string path = "C:\\Dokumente und Einstellungen\\fneueder\\Eigene Dateien\\postleitzahlen\\"+names[i];
char[]spliter= new char[1];
spliter [0]= '>';
char[]spliter2= new char[2];
spliter2 [0]= (char)9;
spliter2 [1]= (char)13;
object []teilen1=db.LoadFile(path,spliter);
string s=teilen1[11].ToString();
object []teilen2=s.Split(spliter2);
string s4=null;
for(k=0;k<teilen2.Length-1;k++)
{
string s2 = teilen2[k].ToString();
char[]zeile= s2.ToCharArray();
string s3;
s3=null;
for(j=0;j<zeile.Length;j++)
{
if (j>4 && zeile[j]==32 && l!=1)
{
if(p<1 && o==1)
zeile[j]=';';
p++;
if(o!=1)
zeile[j]=';';
s3=s3+zeile[j].ToString();
l=1;
n=0;
}
else if (zeile[j]=='\n')
{
s3=s3;
o=0;
}
else if(j<=4 && zeile[j]==32)
{
s3=s4;
n=1;
o=1;
}
else if (zeile[j]=='('||(0<m && m<4))
{
s3=s3;
m++;
o=1;
}
else if (n!=1)
{
s3=s3+zeile[j].ToString();
l=0;
m=0;
}
}
if(o!=1)
{
s4=s3;
}
p=0;
char[]test2 = s3.ToCharArray();
for (x=0;x<test2.Length;x++)
{
if(test2[x]=='?')
z=1;
}
if(test2[5]=='-')
z=1;
if(z!=1)
db.SaveFile(s3,path+".csv");
z=0;
}
}
wer da durchblickt hats verdient das funktioniert 😁
Hallo Molta!
Ich hab auch schon so einige "Konvertierungstülchen" geschrieben, vor allem auch auf String-Basis.
Bei mir sah keines besser aus 🙂
Ich denke das wird auch sehr schwierig, vor allem ist die Nutzbarkeit auf einen sehr eingegrenzten Teil beschränkt, das es nicht zwindend notwendig macht lesbaren Code zu produzieren.
Oder anders ausgedrückt: Für wen willst Du den Code überhaupt lesbar machen, wer will Html-Dateien mit diesem Format auf csv-Dateien konvertieren? (-> Antwort: nur Du und vielleicht nahe Beteiligte von Dir).
Also hier geht Funktionalität vor Lesbarkeit 😁
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Hallo Molta,
mit Regex geht es um einiges kürzer:
Datei zeilenweise einlesen, auf @"^\s*(?<plz>\d+)\s+(?<ort>.*)$" Matchen und die Ergebnisse mit Match.Groups ["plz"] bzw. "ort" abgreifen.
herbivore