Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Search & Replace Tool
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

Search & Replace Tool

beantworten | zitieren | melden

EDIT: 29.03.2016

Binaries sind am Ende dieses Posts zum Download verfügbar. Einfach nach unten scrollen.

EDIT: 21.03.2016

Worum geht es hier? Was hat das Programm für einen Zweck? Es gibt immer wieder stellen im Programm-Code, bei Texten, CSV-Dateien wo einfach Suchen und Ersetzen nicht mehr ausreicht, aber man viele Male die gleiche Arbeit erledigen muss.

Zweck und Sinn des Programmes:

z.B.:
  • Ich möchte aus jeder CSV Zeile ein Insert Statement für eine Datenbank generieren
  • Ich möchte alle Leerzeichen in Tabs umwandeln
  • Ich möchte alle \r\n durch \n ersetzen
  • Ich möchte die Länge des Textes wissen
  • Ich möchte die Zeichensetzung in einem deutschen Text auf eine bestimmte Weise korrigieren.
  • Ich möchte alle Worte einer Spalte hintereinanderhängen
  • Ich möchte eine HTML-Tabelle aus meinem CSV-Text erstellen
  • Ich möchte Spalten aus einem CSV-Text in Zeilen umwandeln oder umgekehrt.
  • Ich möchte Zeilennummern in meinen Text / Code hinzufügen.
  • Ich möchte Zeilennummern aus meinem Text / Code löschen
  • Ich möchte meinen XML -> JSON oder JSON -> XML wandeln
  • Ich möchte meinen XML Code formatieren
  • Ich möchte meinen XML Code minimieren (Strip whitespaces)
  • ...

    usw.

    Immer wenn irgendwo eine Arbeit gemacht wird, wo ich merke, jetzt kommt tausendmal die Sequenz:

    Cursor auf das nächste Wort, Leerzeichen löschen, nächste Zeile einfügen, Return drucken.

    oder irgenetwas wo ich merke ich muss immer wieder das Gleiche tun, was aber einfach mit Suchen und Ersetzen nicht mehr geht,
    dann kann es sinnvoll sein zu prüfen, ob sich der Einsatz dieses Programmes lohnt.




EDIT: 08.01.2014:

Das Projekt ist jetzt auf
http://SearchAndReplace.CodePlex.Com zu finden.

EDIT: 07.012016

Neueste Binary Files im letzten Beitrag angehängt.

EDIT: 04.01.2016

-


Ältere Binaries here:https://www.dropbox.com/s/q1khqnsb58y5x0t/SearchAndReplace.rar

Hallo Community.

Da ich mich öfter mal mit ungewöhnlichen Search & Replace Vorgängen herumschlage, habe ich ein Programm geschrieben, das diese Lücken füllen soll.

Wie funktioniert es?

in Input kann ein Text eingegeben werden oder mit "From Clipboard" einfügen.

in Filter kann dann C# Code zur Laufzeit eingegeben werden, der sich auf die Variable sInput bezieht. sInput ist ein ganz normaler string.

Dieser hat auch Extensions Methods.
Wer möchte kann sich die Script-Klassen-Datei die die Methoden definiert selbst anpassen.
Das Script wird zur Laufzeit compiliert und dann mit dem Programm-Code in der TextBox Filter kombiniert.
________________________________________________________________________


Konventionen:
[...] = Auslassungszeichen

Kurzanleitung:

Results

Mit Results arbeiten

Der Regex-Befehl vor "->" erzeugt die Einzelergebnisse, auf diese kann über ra[Index] (ein Array) zugegriffen werden.

Also anstatt schreiben zu müssen:


Regex.Split(sInput, " ")[0].Reverse()+Regex.Split(sInput, " ")[1].Reverse()+Regex.Split(sInput, " ")[2].Reverse() [B][...][/B]

kann ich folgendes schreiben:


Regex.Split(sInput, " ") ==> ra[0].Reverse()+ra[1].Reverse()+ra[2].Reverse()+ra[3].Reverse()

foreach line[/u][/color]

Hiermit können Suchen/Ersetzen-Vorgänge realisiert werden, die sonst möglicherweise einen höheren Programmieraufwand benötigten.

Will ich z.B. an jede Zeile ein ">>" anhängen reicht ein einfaches


foreach line sInput+=" >>"

foreach result[/u][/color]


Manchmal kommt es aber noch vor, dass man etwas mit den Ergebnissen machen möchte.
Dann ist dieser Befehl wichtig.

Foreach result heisst das mit den "ra"-Variablen des Arrays gearbeitet wird.
Soweit verstanden?

Anmerkungen[/u][/color]

foreach result und foreach line können momentan nicht kombiniert werden.
ist durchaus sinnvoll und fällt mir gerade beim Schreiben auf. Aber dann natürlich noch nicht realisiert.

Module[/u][/color]

Module sind die Textdateien die später die Scripts aus dem Filter enthalten.
Beim erneuten Laden der Exe können diese über Menüpunkte aufgerufen werden.
Der Menüpunkt heisst dann einfach so wie der Dateiname.

Open Module Path[/u][/color]

Explorer wird dort geöffnet, wo die Script-Dateien liegen.

Execute Immediately[/u][/color]

Manchmal möchte man, dass das Script sofort ausgeführt wird,
dann ist Execute Immediately die richtige Option.

Momentan ist das Verhalten derart: Sobald getippt wird (TextChange-Event) wird sofort das eingegebene Script für den aktuell eingegebenen Text ausgeführt .

Monitor Clipboard[/u][/color]

Ist Monitor Clipboard selektiert wird das Clipboard überwacht.
So kann z.B. zusammen mit Execute Immediately ein Text sofort nach der eingegebenen Script Regel
verarbeitet werden.

Top Most[/u][/color]

Die CheckBox oben rechts Top Most ist denke ich selbsterklärend oder?
Das Fenster bleibt immer im Vordergrund.

Re-Input[/u][/color]

Der Ausgabetext (Ergebnis) in Textbox Output wird wieder in die TextBox Input geschrieben.
In manchen Fällen praktisch falls man z.B. kein so kompliziertes Script schreiben will. Man weiss aber, dass man durch mehrmaliges wiederholen des gleichen Scripts ans Ziel kommt.

Compiler Error Message Box[/u][/color]

Treten Compiler-Fehler auf, werden diese in einer MessageBox angezeigt wenn der Menüpunkt angehakt ist, ansonsten rechts im Fenster auf dem Tab "Compiler Results".

(Anmerkung: Dieses Tab wird erst mit der neu hochgeladenen Version sichtbar sein. Der untere Screenshot zeigt noch eine ältere Version)

Wer noch zusätzliche Funktionen braucht, die momentan so nicht so einfach bewerkstelligt werden können, kann in der

SearchAndReplaceMetaclassDefinition.txt

einfach Funktionen nach belieben hinzufügen.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hier die Binaries.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Moderationshinweis von gfoidl (09.10.2013 - 18:07:57):

Ich habs direkt angehängt.
Bei einem Update, etc. schick eine PM ans Team, dann aktualisieren wir den Anhang.

EDIT von herbivore:
Erste Version: SearchAndReplace.rar (1,20 MB, 5 mal heruntergeladen)
Aktuelle Version:

private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Hallo dr4g0n76,

cooles Programm. So etwas ähnliches hatte ich auch immer schon mal vor, aber dann doch nicht die Muße dazu (mich hat unter Windows immer geärgert, daß es dort kein awk gibt).

Einen nervigen Fehler gibt es jedoch beim Resize des Fensters: die Controls sind dann übereinander (s. Anhang).

Und wie startet man den Filter? Bei mir kommt bei "Process" immer nur "System.Void" im "Output". Hast du evtl. eine ältere Version hier hochgeladen (wie man auf dem Screenshot sieht, fehlt bei mir auch das rechte Teilfenster)?

Desweiteren fände ich eine Erklärung der einzelnen Menüpunkte (bes. unter "Misc" und "Prefs") nicht schlecht.

Und schön fände ich es auch, wenn man den Filter auf eine Auswahl von Dateien ansetzen könnte (Batch-Mode).

Edit: das rechte Teilfenster ist doch vorhanden - es war nur ganz klein (aber durch den Splitter konnte ich es dann hervorzaubern). Du solltest es aber standardmäßig größer machen (oder aber mittels eines Buttons oder Menüpunktes ein- und ausblendbar machen).
Und jetzt sehe ich auch die Fehlermeldung:
Zitat
Die Metadatendatei "system.globalization.dll" konnte nicht gefunden werden.
(darum wird also nur "System.Void" bei mir ausgegeben). Was könnte der Grund sein? Welche .NET-Version benötigt dein Programm (oder kann es etwas mit der Windows-Version zu tun haben- ich habe jetzt hier noch unter XP getestet)?

P.S. Mir ist auch aufgefallen, daß du im RAR-File noch die "LowLevelGraphics.pdb" und "LowLevelGraphics.xml" drinhast (also ohne die "LowLevelGraphics.dll"). Wenn du die entfernst, dann sollte das RAR-File auch deutlich kleiner werden (und die "*.vshost.exe"-Dateien benötigen die Anwender ja auch nicht).
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Th69 am .
Attachments
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

@Th69:

Vom GUI her, stimmt sowieso einiges noch nicht und

Hallo dr4g0n76,
Zitat
cooles Programm. So etwas ähnliches hatte ich auch immer schon mal vor, aber dann doch nicht die Muße dazu (mich hat unter Windows immer geärgert, daß es dort kein awk gibt).

Tja da muss man dann doch immer einiges selber machen. ;-)
Mir kam die Idee eines Tages beim Programmieren, als ich mal wieder eine Flut von

Tab
Return
Delete
-
Sequenzenusw. einhämmern musste und genau wusste, ein regulärer Ausdruck oder normales Suchen & Replacen dauert entweder ewig oder ist überhaupt nicht möglich.

Und ebenfalls dauert das von Hand machen eben auch ewig.

Zitat
Einen nervigen Fehler gibt es jedoch beim Resize des Fensters: die Controls sind dann übereinander (s. Anhang).

Das ist nicht nur einer, ich gebe auch zu um das GUI habe ich mich noch ziemlich wenig gekümmert. Aber die Funktionalität ist schon da.
Zitat
Und wie startet man den Filter? Bei mir kommt bei "Process" immer nur "System.Void" im "Output". Hast du evtl. eine ältere Version hier hochgeladen (wie man auf dem Screenshot sieht, fehlt bei mir auch das rechte Teilfenster)?

Man klickt auf Process, bei den Menüitems - wenn Execute Immediately angeklickt ist - dann
Zitat
Desweiteren fände ich eine Erklärung der einzelnen Menüpunkte (bes. unter "Misc" und "Prefs") nicht schlecht.

ich auch. ;-)

Zitat
Und schön fände ich es auch, wenn man den Filter auf eine Auswahl von Dateien ansetzen könnte (Batch-Mode).

Überlegt hatte ich das auch schon. Nur noch keine feste Entscheidung getroffen, wie das ablaufen soll.
Denn ich denke, der User möchte dann hier sehen was passiert.
Da ja doch ziemlich komplexe Vorgänge durchgeführt werden können.

Meine Idee(n) wäre(n) wie folgt:

1.) Der Benutzer kann auswählen, ob er sehen möchte, was passiert und kann jeden einzelnen Schritt bestätigen.

2.) Das Batch wird einfach ausgeführt und fertig.

Sowohl bei 1. als auch bei 2. wird dann hinterher angezeigt:

X Änderungen wurden in Y files gemacht. Und vielleicht ein Protokoll der Änderungen.

Zitat
Edit: das rechte Teilfenster ist doch vorhanden - es war nur ganz klein (aber durch den Splitter konnte ich es dann hervorzaubern). Du solltest es aber standardmäßig größer machen (oder aber mittels eines Buttons oder Menüpunktes ein- und ausblendbar machen).

Jup. Eindeutig. Das nervt.
Ich hätte gerne ein Fenster mit mehreren Splittern, wird noch eingebaut.
Zitat
Und jetzt sehe ich auch die Fehlermeldung:

Zitat:
Die Metadatendatei "system.globalization.dll" konnte nicht gefunden werden.

(darum wird also nur "System.Void" bei mir ausgegeben). Was könnte der Grund sein? Welche .NET-Version benötigt dein Programm (oder kann es etwas mit der Windows-Version zu tun haben- ich habe jetzt hier noch unter XP getestet)?
Zitat
P.S. Mir ist auch aufgefallen, daß du im RAR-File noch die "LowLevelGraphics.pdb" und "LowLevelGraphics.xml" drinhast (also ohne die "LowLevelGraphics.dll"). Wenn du die entfernst, dann sollte das RAR-File auch deutlich kleiner werden (und die "*.vshost.exe"-Dateien benötigen die Anwender ja auch nicht).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Update verfügbar: oben als Dateianhang.

Ausserdem sieht jetzt das gui so aus:



P.S.: Was ich mit den restlichen Controls mache, die sich unten übereinander schieben, wenn man das Fenster kleiner zieht, überlege ich noch.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Hallo dr4g0n76,

leider kann ich deine aktuelle Version nicht mehr (unter XP .NET 4) ausführen:
Zitat
SearchAndReplace.exe ist keine zulässige Win32-Anwendung.

Auch ein Abändern der config auf
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration>
brachte leider keinen Erfolg (d.h. dieselbe Fehlermeldung).

Könntest du es (wieder) als reine .NET 4 (und nicht 4.5!) Version erstellen?
Ich würde dein Tool gerne testen...
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

jop. häng ich hier an.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Hallo dr4g0n76,

ich habe nun die neue Version bei mir gestartet (und jetzt funktioniert sie auch wieder, danke), aber trotzdem ist die GUI immer noch völlig "verrückt" (s. Anhang).
Und selbst wenn ich es groß ziehe (und den Splitter wieder suche, um das rechte Fenster anzuzeigen, sieht es auch nicht besser aus, s. nächster Beitrag).

Hast du evtl. eine andere DPI als die Standardeinstellung 96 bei dir? Oder kennst du dich nicht so richtig mit Dock und Anchor aus?
Attachments
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Leider erhalte ich aber weiterhin die Fehlermeldung
Zitat
Die Metadatendatei "system.globalization.dll" konnte nicht gefunden werden.
und "System.Void" als Output (s.a. Anhang).
Und dies hindert mich leider an der weiteren Funktionalität zu testen (geschweige denn eigene "Module" zu testen).

Dabei habe ich VS 2010 und .NET 4 auf dem Rechner, strange...

PS: Ich wollte gerade diesen Beitrag abschicken, da habe ich noch die vertikalen Splitter entdeckt (für Filter/Input/Output). Die Splitter sind zwar nett, aber jedesmal sie nach Start richtig einzustellen, ist auch etwas mühsam ;-)
Attachments
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Hallo dr4g0n76,

leider erhalte ich auch unter Win7 dieselbe Fehlermeldung.
Aber wenigstens sehr ich hier wieder die unteren Controls, aber dies kann auch an der unterschiedlichen Auflösung liegen
Attachments
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Bitte mal mit dieser Version probieren.

Achtung: Diese benötigt jetzt 2 neue Dlls unter anderem auch die LowLevelGraphicsLibrary.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3984

beantworten | zitieren | melden

Sorry, leider auch mit der neuen Version kommt der gleiche Fehler.

Mit dem Reflector hatte ich gestern mal nachgeschaut: kommt wohl aus der ScriptCompiler2.dll (ReflectiveEvaluator.Eval-Methode).
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (14.10.2013 - 13:16:34):

Bitte behandelt die weiteren Schritte zur Fehlerbehebung per PM.

dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Also, dann hier mal der Zwischenstand, damit man wenigstens sinnvoll damit arbeiten kann, folgendes geupdated:

Filter:
- der Filter Textbox können jetzt mehrere Zeilen angegeben werden.
- Jede Zeile wird momentan einzeln interpretiert.
- Die Ausgabe eines Filters wird dann als Eingabe für den nächsten interpretiert.

- die Reference von System.Globalization.dll wurde auf sysglobl.dll umgestellt,
führte seltsamerweise auf manchen Systemen zu Fehlern.

Bsp.:

Text:
"MIR GEHT ES GUT."

Filter:


sInput.ToLower()
sInput.Filter(".")

Dann passiert intern folgendes:

Zu erst wird sInput.ToLower() ausgeführt:
"mir geht es gut."

Dann:

sInput.Filter(".")

Ergebnis also:
"mir geht es gut."

Damit lassen sich jetzt sehr komplexe Aufgaben erledigen.

TextBox- oben und unten:

- Die Returns werden wieder richtig angezeigt.

Ich hatte vorher nur zwei TextBoxen,
dann: oben RichTextBox unten TextBox,
dadurch wurden die Returns falsch angezeigt.
Jetzt sind beide vom Typ "RichTextBox"

P.S.: Warum sind die anderen DLLs eingebunden?
Ganz einfach: Weil auf lange Sicht, die Anwendung sich quasi von außen in andere integrieren können soll, z.B. in Word.

EDIT: Die Binaries finden sich im ersten Post.
Dieser Beitrag wurde 6 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Die nächste Version wird zusätzlich ein AddIn für Visual Studio sein.
Ich denke das macht evtl. mehr Sinn.

Dann können diese Suchen und Ersetzen Strategien im Editor von VS angewendet werden. Ich denke das macht die Benutzung besser.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Ausblick auf die nächste Version:

Erweiterungen:

1.)
Inzwischen können auch Results benutzt werden,
d.h. wenn z.B.


Regex.Split(sInput.Substring(0,3).Reverse(), " ")

70 Ergebnisse liefert und ich diese weiterverarbeiten will, möchte ich nicht jedesmal schreiben müssen:

Regex.Split(sInput.Substring(0,3).Reverse(), " ")[0] + Regex.Split(sInput.Substring(0,3).Reverse(), " ")[3]

usw.

Hier unten ein Beispiel, wo es noch keine Results gibt, dann muss z.B. so geschrieben werden:


(int.Parse(Regex.Split(sInput, " ")[1]) - int.Parse(Regex.Split(sInput, " ")[0])) /  int.Parse(Regex.Split(sInput, " ")[2])
+ Environment.NewLine +
(int.Parse(Regex.Split(sInput, " ")[4]) - int.Parse(Regex.Split(sInput, " ")[3])) /  int.Parse(Regex.Split(sInput, " ")[5])
+ Environment.NewLine +
(int.Parse(Regex.Split(sInput, " ")[7]) - int.Parse(Regex.Split(sInput, " ")[6])) /  int.Parse(Regex.Split(sInput, " ")[8])
+ Environment.NewLine +
"========" 
+ Environment.NewLine +
((int.Parse(Regex.Split(sInput, " ")[1]) - int.Parse(Regex.Split(sInput, " ")[0])) /  int.Parse(Regex.Split(sInput, " ")[2])
+(int.Parse(Regex.Split(sInput, " ")[4]) - int.Parse(Regex.Split(sInput, " ")[3])) /  int.Parse(Regex.Split(sInput, " ")[5])
+(int.Parse(Regex.Split(sInput, " ")[7]) - int.Parse(Regex.Split(sInput, " ")[6])) /  int.Parse(Regex.Split(sInput, " ")[8]))

Mit Results kann ich jetzt schreiben:


(Result[1] - Result[0]) / Result[2]
+ Environment.NewLine +
(Result[4] - Result[3]) /  Result[5]
+ Environment.NewLine +
(Result[7] - Result[6]) /  Result[8]
+ Environment.NewLine +
"========" 
+ Environment.NewLine +
(Result[1]) - Result[0]) /  Result[2])
+ (Result[4]) - Result[3]) /  Result[5])
+ (Result[7]) - Result[6]) /  Result[8]))

Für diese können auch Aliases festgelegt werden.

Jetzt ist es egal, wie lange die Formel ist bzw. Formeln sind, um diese Werte zu ermitteln.

2.) Ausserdem wurden die Anzahl der Klicks, die benötigt wurden, um z.B. von Wordpad aus automatisch ersetzen zu lassen, reduziert.

3.) Die Splitterpositionen werden jetzt richtig abgespeichert.

4.) Die übersetzte Funktion wird durch ein Delegate intern ersetzt, so dass z.B. in Schleifen (foreach line...) nicht jedesmal neu übersetzt wird, was viel Zeit kostet.

5.) Rechts ist ein Tab in dem man die Results sehen kann.
Diese können durch Doppelklick in den Text übernommen werden.

6.) Die Zeilenumbrüche werden jetzt im Output angezeigt.

7.) Ergebnisse (Results) werden jetzt auf einem Tab rechts - zusätzlich zu den Compiler-Meldungen - angezeigt.

8.) Die "hässlichen" Buttons oben und unten sind verschwunden und wurden durch sinnvollere Controls ersetzt.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Beispiele:

Quasi dynamischen Text aus anderem Text erstellen:[/u][/color]
Mit Results arbeiten.

Eingabe:
Zitat
Mit 5 Results arbeiten ist einfacher als 5 mal denselben langen Ausdruck einzugeben.

Filter:


Regex.Split(sInput, " ") -> string.Format("{3}: {0} + {1} = {2}", ra[1], ra[7], int.Parse(ra[1])+int.Parse(ra[7]), ra[2])

Ausgabe:
Zitat
Results: 5 + 5 = 10

Das schöne ist an diesem Beispiel, wir können die Zahlen austauschen. Die Formel wird immer noch richtig berechnet.

(Anmerkung: Wäre das eigentlich eine Idee für Texte?)


Rtf Text in zwei Spalten Excel:[/u][/color]

Ich möchte einen Text in eine Excel-Tabelle übernehmen (CSV).
Warum? Ich habe Englische Wörter gelernt und einfach in ein rtf notiert.

Dabei habe ich immer durch ein "=" Englisch und Deutsch voneinander getrennt.

In echt kamen hier ca. 3000 Wörter mit der Zeit zusammen.
Irgendwann fand ich dann Excel einfach praktischer.

Der Text wurde folgendermassen notiert:
Zitat
verbatim = wörtlich

honed = feingeschliffen

attainment = erwerbung / erlangung

instill = einimpfen / einflössen / anerziehen(

epigram - sinngedicht

conducive = dienlich / förderlich

conceive = geistig erfassen / begreifen

stray = herumirren

relish = geniessen

diligently = sorgfältig / fleissig
[...]

Das einfachste Script das mir dazu einfällt ist:


foreach line sInput.Replace("=", "\t")

und schon erhalte ich im Output
Zitat
verbatim wörtlich
honed feingeschliffen
attainment erwerbung / erlangung
instill einimpfen / einflössen / anerziehen
epigram sinngedicht
conducive dienlich / förderlich
conceive geistig erfassen / begreifen
stray herumirren
relish geniessen
diligently sorgfältig / fleissig
[...]

und kann direkt ins Excel kopieren.
Der Text wird in 2 Spalten kopiert.

Von Hand hätte das eine Weile gedauert.
Und ich muss mich auch nicht mit den Excel-Import/Export-Funktionen auskennen.
Auch wenn das da auch nicht kompliziert ist. :-)

Klasse erstellen bzw. Snippets[/u][/color]

Irgendwann wollte ich für mein Projekt ImageRecognition2 weitere Klassen erstellen.
Ich hatte aber keine Lust mit irgendeinem Snippet-Editor Templates zu erstellen.
Da fiel mir ein, hey, das müsste doch auch mit meinem Tool gehen.

Hier der Filter dazu:


string.Format(
@"
using System.Drawing;
using LowLevelGraphics.Filter;
using System.Drawing.Imaging;

public class {0} : BaseImageFilter
{1}
	public {0}
	{1}
	{2}

	internal {0}({0} _{0})
	{1}
	{2}

      	public override UnsafeBitmap Execute(UnsafeBitmap bitmapSource)
        	{1}
		throw new Exception(""Implement code!!!"");
	{2}
  
	public override object Clone()
	{1}
		return new {0}(this);
	{2}
{2}

",
sInput,"{","}")

Die Eingabe:
Zitat
AutoHDR

und das Ergebnis:



using System.Drawing;
using LowLevelGraphics.Filter;
using System.Drawing.Imaging;

public class AutoHDR : BaseImageFilter
{
	public AutoHDR
	{
	}

	internal AutoHDR(AutoHDR _AutoHDR)
	{
	}

      	public override UnsafeBitmap Execute(UnsafeBitmap bitmapSource)
        {
		throw new Exception("Implement code!!!");
	}
  
	public override object Clone()
	{
		return new AutoHDR(this);
	}
}
Dieser Beitrag wurde 10 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

Vorabversion zum Testen

beantworten | zitieren | melden

Anmerkung:

Mit dieser Version solltet ihr alles ausprobieren können, was ich beschrieben habe.
"vorherige Endversion" bedeutet bevor mir wieder neue Dinge einfallen, die ich einbauen könnte.
Zitat
Vorabversion zum Testen
EDIT: Vorabversion deshalb, weil sie alles enthält, was die vorherige "Endversion" können sollte.
Aber ich möchte alles so testen, dass alles gut und ohne grössere Probleme funktioniert.
Auch das GUI.

Bisher entdeckte Issues:
- Die Splitter-Positionen werden immer noch nicht richtig reinitialisiert, wenn diese verschoben
wurde. Die Textboxen vergrössern sich auch noch nicht richtig entsprechend
- das Delegate wird nicht aufgerufen oder korrekt erstellt.
- Die Expression Results werden nur angezeigt bevor "->" benutzt wird
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Exe bei denen die Splitter jetzt variabler sind, d.h. die Textboxen werden entsprechend ohne Limits mitvergrössert.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Jetzt sieht die Oberfläche z.B. so aus:
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

[EDIT 29.03.2016: Umgeändert]

Hier kommt evtl. ein anderer Text rein, sonst kann dieser Beitrag später gelöscht werden.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

Neue Version

beantworten | zitieren | melden

mit dieser Version können die Module jetzt in Unterverzeichnisse kopiert werden.
Entweder mit Unterverzeichnissen oder ohne. Gemischt ist gerade nicht möglich.

Der Button Re-Input war unter die anderen Controls verrutscht und ist wieder nutzbar.

Es werden mehr Typen erkannt (auch von generischen Typen sollten jetzt die Ergebnisse aufgelistet werden.)

Die Einstellungen:

Grösse der Form
Position der Form
Position der Splitter
Re-Input
Execute Immediately im Modul Menu
Topmost

sollten in einer config.ini

abgespeichert und wieder neu geladen werden.

Ich habe einige Module kommentiert, damit ist dann doch verständlicher was damit anzustellen ist.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Diese Version habe ich noch nicht ausgiebig getestet. Nur in den Grundzügen, folgendes ist jetzt möglich:

Wenn ihr im Textfeld folgende Daten habt:


Lumbergh, Bill, Initech
Waddams, Milton, Initech
Gibbons, Peter, Initech
Bolton, Michael, Initech


und im Filter:

foreach line "\"" + sInput + "\""


dann wird daraus:

"Lumbergh, Bill, Initech"
"Waddams, Milton, Initech"
"Gibbons, Peter, Initech"
"Bolton, Michael, Initech"[/b]


Das war mir aber immer zu umständlich mit der Zeit, vor allem musste man sich immer die Variable sInput merken.

Jetzt könnt ihr auch folgendes machen:



Lumbergh, Bill, Initech
Waddams, Milton, Initech
Gibbons, Peter, Initech
Bolton, Michael, Initech


und im Filter:

Beginn >> $row << Ende.


dann wird daraus:

Beginn>>Lumbergh, Bill, Initech<<Ende.
Beginn>>Waddams, Milton, Initech<<Ende.
Beginn>>Gibbons, Peter, Initech<<Ende.
Beginn>>Bolton, Michael, Initech<<Ende. [/b]


Also einfach die Variable row benutzen. Das geht auch mit den ganzen .net-Kommandos,
da ich aber bisher nur nach den leerzeichen parse, dürft ihr in dem String kein Leerzeichen benutzen. Werde ich aber in der nächsten Version beheben.

Ihr könnt also auch folgendes machen:


Lumbergh, Bill, Initech
Waddams, Milton, Initech
Gibbons, Peter, Initech
Bolton, Michael, Initech


und im Filter:

Hallo: $row.Substring(0,2)


dann wird daraus:

Hallo: Lu
Hallo: Wa
Hallo: Gi
Hallo: Bo [/b]


So und jetzt noch das beste neue Feature (IMHO):


John,Lennon,guitar,1940
Paul,McCartney,bass,1942
George,Harrison,guitar,1943


und im Filter:

$0 ist $3 geboren.


dann wird daraus:

John ist 1940 geboren.
Paul ist 1942 geboren.
George ist 1943 geboren. [/b]


Der Text wird also behandelt wie Spalten aus einer Datenbank.

Damit solltet ihr immer wiederkehrende Aufgaben die mit Text zu tun haben ziemlich vermindern können.


John,Lennon,guitar,1940
Paul,McCartney,bass,1942
George,Harrison,guitar,1943


und im Filter:

Insert into Info (Place, Surname, Company) Values('$0', '$1', '$2')


dann wird daraus:

Insert into Info (Place, Surname, Company) Values('Lumbergh', 'Bill', 'Initech')
Insert into Info (Place, Surname, Company) Values('Waddams', 'Milton', 'Initech')
Insert into Info (Place, Surname, Company) Values('Gibbons', 'Peter', 'Initech')
Insert into Info (Place, Surname, Company) Values('Bolton', 'Michael', 'Initech')[/b]


Und schon habt ihr Datenbank statements generiert. Usw.
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von dr4g0n76 am .
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Und so sieht das Programm jetzt aus:
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Neuere Version
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

So sieht das Programm jetzt aus.
Jetzt können auch mehrere Row Statements in einer Zeile verwendet werden.

z.B.:

$row $row.Substring(0,2)

usw.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Neue Version.

In dieser Version gibt es folgende Änderungen:

im Filter Fenster wird jetzt Code-Highlighting ermöglicht. Es ist keine Intellisense vorhanden im klassischen Sinne. Das hätte ich zwar ebenfalls schön gefunden, aber noch nicht umgesetzt.

Bei den CheckBoxen gibt es jetzt eine weitere mit "Real time exec" und danach steht "1000".
Hier könnt ihr eine Zeit-Verzögerung eingeben, in welchen Intervallen das Ergebnis unten automatisch angezeigt werden soll.

Verändert ihr den Ausgangs-Text wird einfach neu die Filterfunktion in der mittleren Textbox neu ausgeführt.

Verändert ihr den Filter wird der Code neu kompiliert und DANN die Filter-Funktion ausgeführt.

Ausserdem gibt es jetzt rechts ein Tab "Multi-Viewer" wie ihr sehen könnt.
Dieses versucht automatisch den Typ des Textes zu erkennen und bietet entsprechend eine passende Anzeige.

z.B. für RichText, XML (Treeview) oder HTML...

Zudem werde ich demnächst ein paar Youtube Videos und/oder mp3s verfassen und auf jeden Fall einen längeren Text als Hilfe, damit der Zweck des Programmes klarer wird.
Dazu werde ich jetzt gleich auch nochmal die Anfangsbeschreibung updaten.
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hier eine Zwischenversion als Ausblick zum experimentieren:

Damit das mitgelieferte geladene Beispiel mit den Spalten funktioniert (CSV), müsst ihr einmal im Tab prefs (im rechten Splitter) auf 'Detect' klicken. Sonst nimmt das Programm an, dass die CSV-Datei durch ";" getrennt ist und das Ergebnis bleibt leer.

Die Binaries sind im ersten Post angehängt diesmal.

Die results wie oben beschrieben funktionieren gerade nicht mehr.

Aber dafür könnt ihr jetzt live beim Tippen anschauen, wie sich das Ergebnis verändert, wenn ihr das Häkchen "Real Time Exec" geklickt habt, die 1000 in der Up-Down Box gibt in Millisekunden an, wie lange gewartet wird, bis das Statement im Filter neu ausgeführt wird, wenn was getippt wurde.

Alles klar soweit?

Dann viel Spass damit.

Download, s. erster Post dieses Threads:

Search & Replace Tool

P.S.: Kritik und Vorschläge werden gerne ab der nächsten Version wieder, nicht für diese,
entgegengenommen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

So. Mal wieder eine neue Version angehängt.
Diese kann im ersten Post dieses Threads heruntergeladen werden:
Search & Replace Tool

Diese sollte sich jetzt hoffenlich die Splitter-Elemente sowie Fenster-Position und Grösse merken.

Ausserdem ist das Programm jetzt über die Kommando-Zeile aufrufbar:

SearchAndReplace.exe "Das ist ein Test" sInput.Substring(0,2)

Ergebnis:

Da

usw.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Habe hier ein Video veröffentlicht (Youtube, English),
womit ihr euch einen genaueren Überblick verschaffen könnt.
https://www.youtube.com/watch?v=gO-Rq2xXCq8

(Ich hoffe es ist ok hier auf youtube zu verlinken, wenn nicht, nehme ich den Link raus)

P.S.: Der Ton ist zu leise, wie mir angetragen wurde, also werde ich auf jeden Fall noch mal eine neuere Version machen.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers