Hi Mary,
I have had a similar situation: we have medical results in a Word-document (a letter from the specialist to the family doctor), that needs to be transformed into EDIFact messages, which is a flat-file format where all the text lines are limited to 72 characters. As in your case, new paragraphs and tabs did not show well. I did a lot of ‘parsing’ to get a reasonable result, but it will never be perfect.
One of the first things I made was a proc to reformat the text to a specified number of characters per line, without breaking words:
proc orbis_split_tekst { tekst {lengte 80}} {
# This procedure checks whether (a part of) an additional LAB-text is longer than $lengte characters
# If so, this text is split into separate parts; the list of parts is returned.
set returnlist {};
if {[string length $tekst] > $lengte} {
# String is te lang: opsplitsen in woorden.
set woordlist [split $tekst ” “];
# Tevens wordt er een lege ‘nieuwe tekst’ aangelegd
set newtekst “”;
# Alle woorden worden nu doorlopen
foreach woord $woordlist {
if { [clength $newtekst] == 0} {
# Eerste woord: gewoon toevoegen (zonder spatie) aan ‘newtekst’
set newtekst $woord;
} else {
# Indien er een x0e (andere representatie van .br) volgt: nieuwe regel
if {[cequal $woord x0e]} then {
set returnlist [lappend returnlist $newtekst];
set newtekst “”;
} else {
# Nu wordt de ‘nieuwe’ lengte bepaald: lengte ‘woord’ + lengte ‘nieuwe tekst’ + 1 (spatie)
set nl [expr [clength $woord] + [clength $newtekst] + 1];
# Als ‘nieuwe’ lengte groter dan $lengte, dan wordt de ‘newtekst’ aan de ‘returnlist’ toegevoegd
if {$nl > $lengte} {
set returnlist [lappend returnlist $newtekst];
set newtekst $woord;
} else {
# Anders wordt ‘woord’ aan ‘newtekst’ (met een spatie) toegevoegd
set newtekst [string trim [cconcat $newtekst ” ” $woord]]
};
};
};
};
# De laatste ‘newtekst’ wordt nog aan de ‘returnlist’ toegevoegd.
lappend returnlist $newtekst;
} else {
# Hele tekst kan aan returnlist worden toegevoegd
if {[string length $tekst] > 0} {
lappend returnlist $tekst;
}
};
return $returnlist;
}
Documentation in Dutch though…
Use the proc like this:
set lpostekst [orbis_split_tekst $postekst 132]
As with most things, if I look at this proc now, I’m wondering what I’m doing at some lines. Especially the line ‘set returnlist [lappend returnlist $newtekst]’…
Hope you can do something with this.
Zuyderland Medisch Centrum; Heerlen/Sittard; The Netherlands