Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>Irgendeiner hier, der sich mit Pel auskennt?

Irgendeiner hier, der sich mit Pel auskennt?

HOMBRESINIESTRO26.08.0511:33
Ich bin schier am verzweifeln!

Ich habe für eine linguistische Arbeit einige Chat-Protokolle. Diese sind in RTF Formatiert.
Damit ich sie verwenden kann müssen sie in eine bestimmtes Format. Das will ich natürlich nicht per Hand machen, weil es ewig viele Daten sind.
Nisus Writer Express utnerstützt Perl Scripte. Seh gut!

Also habe ich schon mal ein Macro gebaut, dass die Zeilen durchnummeriert, und zwar mit vorangestellten Nullen (so wie ich es brauche):

#Nisus Macro Block
#source clipboard
#destination clipboard
#before execution
#Copy
#after execution
#Paste
#End Nisus Macro Block
my $count = 1;
while (my $line = <>) {
printf("%.4u\t%s", $count++,$line);
}

So weit so gut. Jetzt brauche ich quasi nur noch zwei weitere Sachen. Erstens einen Hardwrap in jeder Zeile nach 60 Zeichen...

Bisher bin ich soweit, dass ich zumindest sagen kann, wie viele Zeichen in einer Zeile sind:

...
$a = length $line;
if ($a > 60)
{
print("60+ ");
}
...

Allerdings würde ich da gerne einen Hardwrap nach dem 60sten Zeichen einfügen, aber wenn es geht nur, wenn dadurch keine Wörter zerschossen werden und die neue Zeile _nach_ der Zeilennummerierung beginnt (s.o.)

Mein zweites Problem:
Die Chats beginnen fast jede Zeile mit dem Pseudonym gefolgt von Doppelpunkt+Leerzeichen und dann der Text.

Damit man es besser lesen kann, möchte ich, dass der Text überall auf der gleichen Höhe beginnt.

Das habe ich so versucht und das klappt auch ganz gut:

...
$line =~ s/^*: /:\t\t/;
...

Weiß jemand wie ich a) den Hardwrap hinbekomme und b) das Layout dabei möglichst wenig zerschieße?!

Für Hilfe wäre ich sehr dankbar.
0

Kommentare

HOMBRESINIESTRO26.08.0511:34
Sorry! Natürlich "Perl" in der Überschrift!
0
HOMBRESINIESTRO26.08.0511:42
Ein Versuch für den Hardwrap:

...
$a = length $line;
if ($a > 60)
{
$part1 = substr($line,1,60);
$part2 = substr($line,60,$a);
$line = $part1+\n+$part2;
}
...

aber irgendwie klappt das nicht. Die Zeilen werden ganz verschluckt.
0
HOMBRESINIESTRO26.08.0511:52
Okay, soweit so gut. die ersten 60 Zeichen werden abgetrennt:

...
$a = length $line;
$newline = "\n";
if ($a > 60)
{
$part1 = substr($line,0,59);
$part2 = substr($line,59,$a);
$line = $part1.$newline.$part2;
}
...
0
modus
modus26.08.0512:26
Spar dir vielleicht den Ehrgeiz, das selbst zu programmieren: Tex-Edit Plus http://www.tex-edit.com/ hat so eine Funktion schon eingebaut j Zeilenenden einfügen, dort minimale und maximale Länge definieren.

Das Programm ist AppleScript-fähig (einfach mit dem Script-Editor aufzeichnen, speichern und aus dem Script-Menü aufrufen). Ein Script zur Zeilennummerierung wird mitgeliefert.

Und unter http://www.malcolmadams.com/te/ findet man jede Menge weiterer fertiger Scripts für alle möglichen Textkonvertierungsaktionen.

DIe meisten bevorzugen aus guter Programmierertradition BBEdit, aber Tex-Edit Plus ist wesentlich komfortabler, wenn es um Formatierungsarbeiten geht.
0
modus
modus26.08.0512:37
DIe Zeilennummerierung sieht standardmäßig so aus, Leerzeichen als [ ]:
[ ]1:[tab]inhalt
[ ]2:[tab]inhalt

...also ohne Nullen. Das Skript lässt sich im Scripteditor natürlich entsprechend anpassen. Im Original so:

tell application "Tex-Edit Plus"
if exists window 1 then tell window 1

-- put return at end of each line
add line endings appending cr

-- add a line number at the start of each line
repeat with x from 1 to (number of lines)
copy (x as string) & ": " to before line x
end repeat
end tell
end tell

Die führende Anzahl Nullen kann man dann in einem zweiten Schritt per Suchen/Ersetzen nach jedem CR einfügen.
0
HOMBRESINIESTRO26.08.0513:30
Suuper! Das ist wirklich eine Erleichterung. Jetzt werde ich noch die führenden Nullen hinzufügen und dann wieder berichten... (falls es jemanden interessiert)

Auf jeden Fall schon mal vielen Dank!
0
HOMBRESINIESTRO26.08.0514:19
Okay, das Skript sieht bei mir jetzt folgendermaßen aus, um die Nummerierung mit voranstehenden Nullen zu gewährleisten:

tell application "Tex-Edit Plus"
if exists window 1 then tell window 1

-- put return at end of each line
add line endings appending cr

-- add a line number at the start of each line
repeat with x from 1 to (number of lines)
if x < 10 then
copy "000" & (x as string) & " " to before line x
else if x < 100 then
copy "00" & (x as string) & " " to before line x
else if x < 1000 then
copy "0" & (x as string) & " " to before line x
else if x < 10000 then
copy (x as string) & " " to before line x
end if
end repeat
end tell
end tell

Ich habe auch noch den Doppelpunkt entfernt und drei Leerzeichen eingesetzt.

Ich bin jetzt restlos glücklich! Vielen Dank nochmal an modus!
0
modus
modus26.08.0514:26
Gerne.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.