PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer kennt sich richtig gut mit Visual Basic aus?


cereal
2006-06-14, 14:30:07
Hallo Leude,

ich hatte schon einmal in einem Thread nachgefragt, allerdings ist in diesem ein Chaos entstanden und zum Schluss keine funktionierende Lösung. Also hier nochmal klar gesagt, was es können soll:




1;4;37287;Meier;7
4;7;|;3

setze trennzeichen=|

antwort:

1|4|37287;Meier|7
4|7|||3


WICHTIG: Das ; bleibt bei dem Text erhalten. Ich hab absolut keine Idee, wie man das anstellen könnte, denn das Textfeld ist variabel, mal 7 Zeichen, mal 12, mal 3, die Anzahl der Zahlen ODER Buchstaben davor ist auch unterschiedlich. Ich hoffe ihr könnt mir weiterhelfen.

Mfg

Gast
2006-06-14, 14:42:02
Also dass ich das Problem jetzt richtig verstehe:

Du hast folgenden String
1;4;37287;Meier;7
und das Programm soll jetzt raten, an welcher Stelle es das Zeichen ; nicht durch das Zeichen | ersetzen soll?

Monger
2006-06-14, 14:45:11
Hrm... sehe ich das richtig, dass vor jeder Zahl ein "|" kommt, und vor jedem Text ein ";" ? (bis natürlich auf den allerersten Wert)

Wenn ja, solltest du sowas wie einen Tokenizer verwenden, der dir deinen Text überall da aufsplittet, wo ein Strichpunkt auf eine Zahl folgt. Wahrscheinlich wäre das ein Fall für reguläre Ausdrücke...

Aber im Prinzip müsste es so gehen:

- Spalte eine Zeile entlang aller Kombinationen von Zahl+; auf
- Entferne die Strichpunkte am Ende aller Bruchstücke, wenn notwendig
- Setz die Bruchstücke erneut zusammen, füge aber diesmal vor bzw. hinter jedem Teil einen "|" ein

Edit: Wenn ich das noch richtig im Kopf habe, wäre der reguläre Ausdruck dazu: [0-9]; -> [0-9]|

Ich hab keine Ahnung wie das unter VB funktioniert, aber vielleicht sagt dir das ja irgendwas...

cereal
2006-06-14, 14:51:34
Gast[/POST]']Also dass ich das Problem jetzt richtig verstehe:

Du hast folgenden String
1;4;37287;Meier;7
und das Programm soll jetzt raten, an welcher Stelle es das Zeichen ; nicht durch das Zeichen | ersetzen soll?

das programm soll das ; lassen wie es ist, WENN neben dem ; ein text steht

cereal
2006-06-14, 14:55:30
@ Monger:

meine Daten liegen wie folgt vor:

1;4;37287;Meier;7
4;7;|;3


udn sie sollen so werden:

1|4|37287;Meier|7
4|7|||3

Alle ; sollen durch ein | ersetzt werden, ABER dort wo ein Text neben dem ; steht, bleibt das ;

HajottV
2006-06-14, 15:00:35
cereal]
Alle ; sollen durch ein | ersetzt werden, ABER dort wo ein Text neben dem ; steht, bleibt das ;

Ich würde Dir ja helfen, aber so, wie Du es beschreibst, ist die Aufgabenstellung unklar.

Wieso ist | kein Text? Was macht für Dich denn ein Text aus?

Eigentlich müßte aus ;|;a doch ;||a werden.

Gruß

Jörg

Monger
2006-06-14, 15:05:14
cereal[/POST]']...
Alle ; sollen durch ein | ersetzt werden, ABER dort wo ein Text neben dem ; steht, bleibt das ;

Hast du prinzipiell verstanden was ich gesagt habe? Mein Vorschlag berücksichtigt zwar keine Ränder o.ä. , aber im Prinzip sollte es stimmen.

Du kannst es auch so machen:

- erst ALLE ; durch | ersetzen
- dann nach allen Kombinationen von |+Buchstabe suchen, und durch ;+Buchstabe ersetzen

Klar?

Gast
2006-06-14, 15:08:59
cereal[/POST]']das programm soll das ; lassen wie es ist, WENN neben dem ; ein text stehtDas dachte ich mir. Aber woher kommt der Text. Ist das einfach ein Eingabefeld? Denn dort kann ich ja auch statt "Müller" "12345" eingeben. Wie wird sichergestellt, dass sich in dem Text auch nur Text und keine Zahlen befinden?

Wenn du garantieren kannst, dass in dem Textfeld nur Buchstaben und in den Zahlenfeldern nur Zahlen stehen, dann ist das einfach.

Private Sub Command_Click()

Dim Text As String, x As Integer

Text = "1;4;37287;Meier;7"

Text = Replace(Text, ";", "|") ' erst einmal alle ; durch | ersetzen

For x = 1 To Len(Text)
If Mid(Text, x, 1) = "|" Then ' nur diese Stellen müssten ersetzt werden
If Not (Mid(Text, x + 1, 1) >= "0" And Mid(Text, x + 1, 1) <= "9" Or Mid(Text, x + 1, 1) = "|") Then
' Semikolon statt | setzen
Mid(Text, x) = ";"
End If
End If
Next

MsgBox Text

End SubOder ist vielleicht immer das vierte Feld das Zeichenfeld? Dann müsstest du ja nur die Anzahl der Semikolon zählen um es zu finden.

HajottV
2006-06-14, 15:09:16
Monger[/POST]']Hast du prinzipiell verstanden was ich gesagt habe? Mein Vorschlag berücksichtigt zwar keine Ränder o.ä. , aber im Prinzip sollte es stimmen.

Du kannst es auch so machen:

- erst ALLE ; durch | ersetzen
- dann nach allen Kombinationen von |+Buchstabe suchen, und durch ;+Buchstabe ersetzen

Klar?

Kann nicht klappen.

test|test wird bei Dir zu test;test... das ist falsch.

Gruß

Jörg

cereal
2006-06-14, 15:11:05
Erläuterung:
Das Problem ist, dass das Trennzeichen ; zufälligerweise das gleiche Zeichen ist, wie das Trennzeichen von einem zum anderen Wert in der Datenbank.

Beispiel Kunde:


4242342343;München;80493;323232

muss umgewandelt werden zu :


4242342343|München;80493|323232
Kundennr. Ort Rechnr.



Ein Text macht für mich eine Buchstabenreihe mit mindestens 5 Buchstaben aus

Gast
2006-06-14, 15:19:02
cereal[/POST]']Erläuterung:
Das Problem ist, dass das Trennzeichen ; zufälligerweise das gleiche Zeichen ist, wie das Trennzeichen von einem zum anderen Wert in der Datenbank.

Beispiel Kunde:


4242342343;München;80493;323232

muss umgewandelt werden zu :


4242342343|München;80493|323232
Kundennr. Ort Rechnr.



Ein Text macht für mich eine Buchstabenreihe mit mindestens 5 Buchstaben ausAlso wohnt keiner der Kunden in Köln? Muss jetzt eigentlich das Semikolon vor oder hinter den Text, weil du es oben anders hast?

cereal
2006-06-14, 15:20:01
Gast[/POST]']Also wohnt keiner der Kunden in Köln? Muss jetzt eigentlich das Semikolon vor oder hinter den Text, weil du es oben anders hast?

sorry, das simikolon kommt immer hinter den text.
jop, kein kunde aus köln

Gast
2006-06-14, 15:30:44
Köln habe ich nur als Beispiel angeführt, da es in deiner Datenbank offensichtlich keine Orte mit 4 oder weniger Buchstaben gibt. Ist das so?

Deine Daten könnten nämlich auch so aufgebaut sein:
Kundennr.|Ort|Rechnr.
01234567;München;080493;12345
01234568;1200 New York;12346
01234569;Silz;12347

Im ersten Fall wurde im zweiten Feld "Ort" ein Ort mit einer Postleitzahl durch Semikolon getrennt eingegeben. Im zweiten Fall steht die Postleitzahl vorne ohne Trennung. Und im letzen Fall gibt es keine Postleitzahl. Für einen Computer so nicht auswertbar.

Aber wenn das aus einer Datenbank stammt, dann ist die Reihenfolge der Felder ja immer gleich.

z.B. Kundennr.|Ort|Rechnr.

Somit weißt du doch, dass das zweite Feld immer der Ort ist! Also von vorn bis zum zweiten Feld lesen, dann von hinten bis zum zweiten Feld. Alles was übrigbleibt ist dann das Feld Ort.

Monger
2006-06-14, 15:31:50
HajottV[/POST]']Kann nicht klappen.

test|test wird bei Dir zu test;test... das ist falsch.

Gruß

Jörg

Warum ??? Jedem Text soll ein Semikolon vorangehen, allem anderen nicht. Was ist an test;test falsch?

Gast
2006-06-14, 15:33:54
cereal[/POST]']Das Problem ist, dass das Trennzeichen ; zufälligerweise das gleiche Zeichen ist, wie das Trennzeichen von einem zum anderen Wert in der Datenbank.Also in der Datenbank steht das ganz sicher nicht so. Wie soll das denn die Datenbank unterscheiden? Das was du zeigst, erscheint mir eher wie der Export aus einer Datenbank. Kann das sein, dass wir hier über CSV-Dateien sprechen?

Wäre es dann nicht viel einfacher, beim Export ein anderes Trennzeichen zu verwenden?

HajottV
2006-06-14, 15:37:29
Monger[/POST]']Warum ??? Jedem Text soll ein Semikolon vorangehen, allem anderen nicht. Was ist an test;test falsch?

test|test ist eine Wert... und den zerhackst Du in zwei Werte.

So...

Cereal, bitte in Zukunft GENAU angeben, was Du haben möchtest. Am besten mit 30 Beispielen. Sonst haben die Leute irgendwann keine Lust mehr, Dir die Dinge aus der Nase zu ziehen.


Function Replace(Wert As String) As String
c = 0
For j = Len(Wert) To 1 Step -1
a = Mid(Wert, j, 1)
If a = ";" And c < 5 Then a = "|"

c = c + 1
If InStr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüÄÖÜß", a) = 0 Then c = 0

Replace = a + Replace
Next
End Function


Ersetzt jedes ; dem nicht mindestens 5 Buchstaben folgen durch ein |.

Ob das jetzt das ist, was Du brauchst, weiß ich nicht, aber es ist das, was Du gewünscht hast.

Gruß

Jörg

cereal
2006-06-14, 15:56:03
der ganze fall hat sich erledigt --> wir werden nun ein anderes trennzeichen verwenden, da das ganze ansonsten zu komplex wird.

aber eine andere frage :)


ich benötige ein VBA Makro, dass 5 *.csv Dateien öffnet und anschließend ein Makro über alle 5 laufen lässt.

Das Makro, dass die 5 Dateien öffnet heißt open_csv
und das andere soll heißen create_transformed



danke

mfg

cereal

Monger
2006-06-14, 16:29:14
cereal[/POST]']
aber eine andere frage :)


ich benötige ein VBA Makro, dass 5 *.csv Dateien öffnet und anschließend ein Makro über alle 5 laufen lässt.

Das Makro, dass die 5 Dateien öffnet heißt open_csv
und das andere soll heißen create_transformed

Und was ist die Frage? Irgendwie ist der Kommentar von HajottV an dir irgendwie vorbeigegangen, oder? ;)

cereal
2006-06-14, 16:33:24
Monger[/POST]']Und was ist die Frage? Irgendwie ist der Kommentar von HajottV an dir irgendwie vorbeigegangen, oder? ;)


ich habe die aufgabenstellung gesagt :)

ihr könnt einfach 5 dateien von euch verweden, ich passe mir das ganze entsprechend an :)

ich hoffe nun ist es klar?!


mfg