| |
|
|
Thomas Freier | Ich habe mal eine Frage, wie ist das folgende Problem besser (schneller) zu lösen: In einer Textdatei, erzeugt von einer PDF durch Adobe oder PDFtoText.exe, werden Worte zusammengezogen. Diese würde ich gerne wieder trennen, wenn innerhalb eines Wortes Großbuchstaben auftauchen. Ist eine Vorbereitung für die Sprachausgabe und es hört sich nicht gut an, wenn vor einem Hauptwort kein Leerzeichen ist. Meine bisherige Lösung: KompilierenMarkierenSeparierenZusammengefasste Wörter bei einem Großbuchstaben trennen
Dim$ 500
declare this$, insideThis$, Nr_B%, Nr_B1%, Such$ , Such%, Edit$, N_Strg%, Ende%
Proc isOneInside von Michael Wodrich
Syntax: isOneInsice( this$, insideThis$ )
Ist eines der Zeichen in this auch in insideThis enthalten?
this wird als eine Aufzaehlung von einzelnen Zeichen betrachtet.
Parameters this$, insideThis$
Declare Ok%
WhileLoop Len(this$)
If InStr(Mid$(this$, &loop, 1), insideThis$)
If &Loop>Nr_B1%
Ok% = 1
Nr_B% = &Loop
BREAK
EndIf
EndIf
EndWhile
Return Ok%
EndProc
cls
Edit$=WastutLübeckaufdemReisemarktHeute ohneTourismusmanager
Print Edit$
insideThis$=ABCDEFGHIJKLMNOPQRSTUVWXYZÄÜÖ
..............Alle Worte trennen und speichern
WhileLoop 50
List$ &Loop = Substr$(Edit$,&Loop, )
IF List$(&Loop) =
N_Strg%= &Loop-1
Break
EndIf
EndWhile
.............ist innerhalb eines Wortes ein Großbuchstabe?
WhileLoop n_Strg%
Such$= List$(&Loop)
print such$
this$= right$(Such$,len(Such$)-1)
Nr_B1% = 0
..........................suchen ab Wortanfang ohne 1. Buchstaben
WhileLoop 10
if isOneInside( this$, insideThis$ )
Such$= Ins$( ,Such$,(Nr_B% + 1)) gefunden und Leerzeichen vor Großbuchstaben
Nr_B1% = Nr_B% + 1 einsetzen
this$= right$(Such$,len(Such$)-1)
Else
Break
endif
Wend
print such$
Print
List$ &Loop = Such$
EndWhile
Print
.............String neu zusammen setzen
Edit$ =
WhileLoop n_Strg%
Edit$ = Edit$ + List$(&Loop)+
EndWhile
print Edit$
WaitKey
|
|
|
| |
|
|
|
Jörg Sellmeyer | So zum Beispiel: KompilierenMarkierenSeparieren KompilierenMarkierenSeparieren Auf die gleiche Weise kannst Du noch die ganzen Präpositionen und Bindewörter freistellen und Du hast schon einen halbwegs lesbaren Text. Wenn Du dann noch alle Möglichkeiten von sein und haben sowie einige Basisverben (z.B. machen) erledigst... Achja, die Artikel noch! Mit dem richtigen Match$-Befehle geht das alles in einer Schleife. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 21.11.2007 ▲ |
|
|
|
|
Thomas Freier | @ Jörg, DANKE, sieht kurz und gut aus. |
|
|
| |
|
|
|
Jörg Sellmeyer | Thomas Freier
@ Jörg, DANKE, sieht kurz und gut aus.
Es ist kurz und gut |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 21.11.2007 ▲ |
|
|
|
|
Jörg Sellmeyer | Hallo Thomas, Ich antworte mal hier, dann haben alle was davon: Trennstriche am Zeilenende lassen sich leicht mit Translate$(Text$,- ,) herausfiltern. Du kannst Deinen Text sogar gleich in Absätze zerlegen: KompilierenMarkierenSeparierenText$ = Hier_die_Funktion_die_den_Text_aus_PDF_liest()
Text$ = Translate$(Text$,-
,) Trennstriche erschlagen
While Match$([!~?~.]
,Text$) >
Text$ = Translate$(Text$,$Match,Left$($Match,1) + |) alle Zeilenumbrüche mit Satzendezeichen zum Sichern umwandeln
Wend
Text$ = Translate$(Text$,
,)alle Zeilenumbrüche raus
While Match$([!~?~.]~|,Text$) >
Text$ = Translate$(Text$,$Match,Left$($Match,1) +
) Zeilenumbrüche zurückschreiben
Wend
Jetzt hast Du im Prinzip absatzformatierten Fließtext. Den kannst Du jetzt dem Vorleseprogramm übergeben, oder, wenn Deine Frau gerne selber lesen möchte, in beliebiger Schriftgröße in einem Multiedit unterbringen. Mit eingestelltem automatischem Zeilenumbruch (negativer Wert für Höhe) sollte das dann problemlos lesbar sein. In einem RTF-Control kannst Du es sogar noch beliebig formatieren. Gruß Jörg |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 22.11.2007 ▲ |
|
|
|
|
| Hm, wäre imho etwas performanter da ohne regexp und ohne schleifen auch mit KompilierenMarkierenSeparierenvar in$=Hier_die_Funktion_die_den_Text_aus_PDF_liest()
in$=translate$(in$,-
,)
in$=translate$(in$,|,chr$(1))
in$=translate$(in$,!
,!|)
in$=translate$(in$,?
,?|)
in$=translate$(in$,.
,.|)
in$=translate$(in$,
,)
in$=translate$(in$,|,
) ich würde hier wahrscheinlich der Optik halber sogar
angeben, unwichtig...
in$=translate$(in$,chr$(1),|)
print in$
gegangen. Da ichs hier in das Communityedit getippt habe kann sich aber sicher ein Fehlerchen eingeschlichen haben.
Interessanterweise gleiche Anzahl von Zeilen. *g* Wohlmöglich wäre es also sogar noch ein Stück schneller wenn man diese Zeilen zu einer einzigen zusammenfasst. |
|
|
| |
|
|
|
Jörg Sellmeyer | Obs schneller ist, käme auf einen Versuch an. Meine erste Schleife wird ja auch nur maximal 3mal durchlaufen. Wenn z.B kein ? im Text vorhanden ist, sogar nur 2mal. Die zweite Schleife kann man sich sowieso schenken. War ein Denkfehler meinerseits. KompilierenMarkierenSeparieren reicht ja schon. Womit ich dann bei fünf Zeilen bin und evtl. weniger Durchläufen. Außerdem finde ich diese RegEx-Sachen irgendwie cool |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 23.11.2007 ▲ |
|
|
|
|
| ok, testen! Steilvorlage für ein TestSkelett: [...] (einfach in die perfproc das eintragen was zu testen ist)
Wäre doch echt interessant...
Aber der Coolnessfaktor ist tatsächlich unübersehbar. |
|
|
| |
|
|
|
Thomas Freier | Toll!!! Ihr seid schneller als der Schall. Vorhin war hier Stille und ich habe mich auf die Suche nach Software gemacht. Werde die Tips morgen ausprobieren. Jörg du hast recht, es sind Probleme, die viele interessieren könnten. |
|
|
| |
|
|
|
Thomas Freier | So, ich mußte es doch noch ausprobieren. Entweder mach ich einen Fehler, oder meine Lösung hat die wenigsten. Anstoß der Aktion: der Versuch, Eine Zeitungsseite als PDF erhältlich, sich vorlesen zu lassen. Die ganze Seite ist kein Problem, dass kann Adobe auch. Aber möchte ich nur einen Artikel lesen oder noch einmal vorlesen lassen, so geht das nicht. Und wer möchte schon alle Anzeigen hören! In der Anwendung kann das Programm nur über die Tasten gesteuert werden bis zu Scannen, aber soweit bin ich noch nicht. Zum Einsatz kommt ein alter Laptop mit 800*600 Auflösung. Im Anhang auch eine von Adobe erzeugte Textdatei (LN-Adobe.txt). Wobei Adobe eine fehlende Struktur, bei der Zeitung wußten die gar nicht was darunter zu verstehen ist, bemängelt und dann zeilenweise über mehrere Blöcke den Text erzeugt. Grrrrr! |
|
|
| |
|
|