Laden...

html in csv umwandeln

Erstellt von Molta vor 18 Jahren Letzter Beitrag vor 18 Jahren 8.301 Views
M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren
html in csv umwandeln

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 😉

4.506 Beiträge seit 2004
vor 18 Jahren

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!”

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

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
.
.
.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Wenn es sich um XHTML handelt, dann wäre das eine typische Aufgabe für XSLT.

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

handelt es sich denn bei der datei oben um xhtml ^^?

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

Beim zweiten Hinsehen würde ich sagen, XSLT ist doch keine gute Wahl. Die eigentlichen Daten sind ja nicht XML-strukturiert, hatte ich übersehen.

P
939 Beiträge seit 2003
vor 18 Jahren

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

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

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

P
939 Beiträge seit 2003
vor 18 Jahren

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.

563 Beiträge seit 2004
vor 18 Jahren

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

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

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 😁

4.506 Beiträge seit 2004
vor 18 Jahren

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!”

49.485 Beiträge seit 2005
vor 18 Jahren

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