romberto
Goto Top

Per Batch Texteile entfernen und verschieben, Sonderzeichen und Zeilenumbrüche löschen

Hallo,

ich habe mal wieder ein Problem mit unseren Archivierten Firmendateien. Dank eurer Hilfe konnte ich die "Neuzeit" schon ziemlich Fix abarbeiten. Die 1980er und 1990er Jahre bereiten mir aber immernoch arges Kopfzerbrechen. Hier wurde damals auf Commodore gearbeitet und der damalige "Administrator" hatte ein BBS eingerichtet. Mangels Kenntnis und geeigneter Hardware habe ich auf das BBS selbst leider keinen Zugriff. Nach intensiver Recherche konnte ich jetzt jedoch mittels eines Amiga Emulators (Ja, Tatsache) die .DIZ Dateien der Archive in eine Liste schreiben.

Diese gilt es nun in ein Schema zu bringen:

Unser "Administrator" hat sich nun leider bei der Dateienbeschreibung mit wahren Ascii Kunstwerken verwirklicht, was es mir keineswegs einfacher macht.

Hier ist mein Beispiels-Output:

[0036] mu-arbp5.TXT          
Filetype: ASCII                    _________  ____ _ ___           __     
Size: 47390                   _______ 
Date: 22-Aug-1995            .\--»   ___/ .\   ___/______ _/___/__\/\/__/ 
                             ¦                                          :
                             ¦ Arbeitsprojekt Mustermann 5.0            .
                             :                                          ¦
                             `----------------------------[           ]-'  
                             

[0037] blamap.zip           ,__ ______                    ______
Filetype: ZIP                 ___\  ____)|__   __ __,   ____  ____) ____
Size: 70003                  |                     | 
Date: 04-Sep-1991            .-----------\----------------\------------\.
                             |                                          |
                             ·------------------------------------------·
                             | Mappe Blablabla                          |
                             | noch mehr Blablabla                      |
                             | usw...                                   |
                             |                                          |
                             `------------------------------------------'  
                              ____
                             /\___\ ___ __ _
                             \/___/        /__ _   

Das ganze muss am Schluß dann so aussehen:

mu-arbp5.TXT [TAB] 22-Aug-1995 [TAB] Arbeitsprojekt Mustermann 5.0
bla-map.zip  [TAB] 04-Sep-1991 [TAB] Mappe Blablabla # noch mehr Blablabla # usw...

Ihr seht, keine leichte Aufgabe. Meine Überlegungen gehen in folgende Richtung:

- Löschen einzelner Textbausteine ("Filetype:" und "Size:" + jeweils 15 Folgezeichen)
- Verschieben einzelner Textbausteine in je ein Temporäres Dokument (Date: + 15
Folgezeichen und [xxxx] + 15 Folgezeichen mit anschließender Löschung von [xxxx])
- Entfernen aller Sonderzeichen und Zeilenumbrüche in der Beschreibung
- Zusammenfügen der einzelnen Bausteine

Wie und ob das ganze überhaupt zu verwirklichen ist, ist mir allerdings ein Rätsel. Sollte das ganze via Batch nicht zu verwirklichen sein, wäre ich wirklich über jeden weiteren (auch Teil-) Lösungsvorschlag dankbar! Sei es VB, Shell, spezielle Editoren, Office Programme, Shareware etc..

Viele Grüße und schonmal vielen Dank fürs anschauen

Euer Robert

Content-Key: 204725

Url: https://administrator.de/contentid/204725

Printed on: April 19, 2024 at 05:04 o'clock

Mitglied: 64748
64748 Apr 10, 2013 updated at 08:16:49 (UTC)
Goto Top
Hallo
#!/usr/bin/perl

use strict ;
use warnings ;
use feature 'say' ;  

open DATEI, "projekte.txt" ;  
undef $/ ;

my $file = <DATEI> ;
my @records = split /\[\d\d\d\d\]/, $file ;
close DATEI ;

my ( $rec, $i ) ;
foreach $rec ( @records ) {
    my ( $name, $date, $text ) ;
    next if $rec eq "" ;  
    my @lines = split /\n/, $rec ;
    foreach ( @lines ) {
        s/^\s+[^a-zA-Z0-9 ]// ;
        s/\s+[^a-zA-Z0-9]+$// ;
        s/^[^a-zA-Z0-9]*$// ;
        s/^\s+// ;
        if ( $_ =~ m/Date: ([-0-9A-Za-z]+)/ ) {
            $date = $1 ;
        }
    }
    $name = $lines ;
    for ( $i=4; $i<@lines; $i++ ) {
        $text .= $lines[$i] if $lines[$i] !~ /^\s?$/ ;
    }
    say "$name;$date;$text" ;  
}
Ausgabe
mu-arbp5.TXT;22-Aug-1995;� Arbeitsprojekt Mustermann 5.0
blamap.zip;04-Sep-1991;Mappe Blablablanoch mehr Blablablausw..
Ich habe das Zeichen vor "Arbeitsprojekt" nicht in den Griff bekommen face-wink.
Das Ergebnis wäre dann eine CSV-Datei die Du problemlos mit Excel weiter verarbeiten könntest.
Außerdem habe ich die Textzeilen einfach aneinander gehängt. Das lässt sich leicht ändern.

Wenn Du keinen Linuxrechner hast, dann installier Dir Strawberry-Perl

Und wenn Du gar nicht zurechtkommst, dann schick mir eine PN mit einem Angebot, ich kann Dir das auch umwandeln.

Markus
Member: romberto
romberto Apr 10, 2013 at 08:56:56 (UTC)
Goto Top
Hi Markus,

vielen dank schoneinmal für dein Perl Script. Leider bekomme ich sowohl unter Ubuntu als auch mit Strawberry-Perl unter Windows folgende fehlermeldungen:

Bei unveränderter Anwendung:

readline() on closed filehandle DATEI at c:\script\perl.pl line 10.
Use of uninitialized value $file in split at c:\script\perl.pl line 11.

wenn ich nun (zugegeben ein reiner Schuss ins Blaue) <DATEI> durch <projekte.txt> ersetzte bekomme ich folgendes:

Use of uninitialized value $date in concatenation (.) or string at c:\script\perl.p
l line 32.
Use of uninitialized value $text in concatenation (.) or string at c:\script\perl.p
l line 32.
projekte.txt;;

da ich von Perl rein garkeine Ahnung habe, bitte ich etwaige Anfängerfehler nicht allzu hart abzustrafen face-smile

Viele Grüße

Robert
Mitglied: 64748
64748 Apr 10, 2013 updated at 09:06:09 (UTC)
Goto Top
Also
open DATEI, "projekte.txt" ;   
projekte.txt wäre der Dateiname der zu öffnenden Datei (wo Deine Daten drin sind). "Datei" ist das sog. Filehandle, mit dem spricht man die geöffnete Datei im Programm an, das musst Du nicht ändern. ersetze projekte.txt Durch den Dateinamen (evtl. auch Pfad), den diese Datei bei Dir hat.

Dann öffnet das Skript diese Datei und wenn weitere Fehlermeldungen kommen, poste diese bitte.

Ach ja, wenn es mehrere Dateien sind, dann kann man das natürlich so abändern, dass die auf der Kommandozeile übergeben werden. Auch das Schreiben der Ausgabe in eine Datei kann man "nachrüsten".

Markus
Member: romberto
romberto Apr 10, 2013 at 10:00:59 (UTC)
Goto Top
Hallo Markus,

Dank dir! Ich hatte die Datei zwar in projekte.txt umbenannt, aber der fehlende Pfad war das Problem, jetzt funktioniert es wie es soll face-smile

Den Scriptstart und das Schreiben in eine neue Textdatei habe ich mit einer kleinen Batch gelöst:

@echo off & setlocal
perl c:\script\perl.pl >> c:\script\sortiert.txt
pause

Allerdings werden ab und an einige Sonderzeichen dennoch mit ausgelesen -> gibt es eine Möglichkeit die Ausschlusszeichen für die Beschreibungszeile zu erweitern?

Ansonsten bin ich wirklich Happy

Vielen Dank nochmal

Robert
Mitglied: 64748
64748 Apr 10, 2013 at 10:08:56 (UTC)
Goto Top
Wenn man davon ausgeht, dass jede "gewünschte" Zeile mit einem Buchstaben oder einer Zahl anfängt, dann kann man hinter Zeile 23 einfügen
s/^[^A-Za-z0-9]+// ;
Das löscht alle Zeichen am Beginn jeder Zeile, die nicht Buchstabe oder Zahl sind.

Reicht das?

Markus
Member: romberto
romberto Apr 10, 2013 at 10:35:35 (UTC)
Goto Top
Hi Markus,

Vielen Dank - das klappt schon viel besser. Das was nun über bleibt sind Muster / Zeichenfolgen in denen z.B. Buchstaben stehen:

|:\/_______l____j_\________\/ /___:    l |:|

da werde ich um eine manuelle Bearbeitung wohl nicht rum kommen.

Bzw. wäre es nicht auch möglich eine Art Zeichenkatalog zu erstellen, anhand dessen ich mittels einer Batch bestimmte Muster aus dem finalen Text löschen könnte? Viele Muster kommen immer wieder vor und wenn es möglich wäre jedes Muster das Neu auftaucht manuell in eine art Datenbank einzutragen, hätte man irgendwann alles abgedeckt.

Viele Grüße

Robert
Mitglied: 64748
64748 Apr 10, 2013 updated at 10:52:36 (UTC)
Goto Top
Hinter Zeile 15 füge mal
if ( $_ !~ m/[a-zA-Z0-9][a-zA-Z0-9]+/ ) {
            $_ = "" ;
        }
ein. Damit werden alle Zeilen gelöscht, in denen nicht mindestens zwei alphanumerische Zeichen hinter einander vorkommen.

Kürzer ginge auch
if ( $_ !~ m/\w\w+/ ) {
     ....

Markus
Member: romberto
romberto Apr 10, 2013 at 11:22:33 (UTC)
Goto Top
Hi Markus,

Puh... das scheint alles nur ein Tropfen auf den heißen Stein zu sein. Ich bin ja froh, dass es schon soweit funktioniert, wie es das jetzt tut. Aber ich denke ohne eine Art "Lösche bestimmte Zeichenfolge / Satzfolge anhand einer vorgegebenen Liste" komme ich hier wohl nicht aus. Dafür werde ich aber gleich nochmals eine seperate neue Frage eröffnen.

Nochmals vielen, lieben Dank für deine Mühe und dein super Script!

Viele Grüße

Robert
Mitglied: 64748
64748 Apr 10, 2013 updated at 22:19:07 (UTC)
Goto Top
So, hier noch eine Lösung bei der zumindest für Dein gepostetes Beispiel keine überschüssigen Zeichen bleiben.
#!/usr/bin/perl

use strict ;
use warnings ;

open DATEI, "projekte.txt" ;  
while ( <DATEI> ) {
    s/\s[^a-zA-Z0-9]+(\n)/$1/g ;
    s/\|/ /g ;
    s/¦//g ;
    s/Filetype.*$// ;
    s/Size.*$// ;
    s/Date:\s// ;
    s/^\s+//g ;
    s/^$//g ;
    s/\n/ # / ;
    s/\[\d+[^]]\]\s/\n/ ;
    print $_ ;
}
print "\n" ;  
Ausgabe
mu-arbp5.TXT # 22-Aug-1995 # Arbeitsprojekt Mustermann 5.0 # 
blamap.zip # 04-Sep-1991 # Mappe Blablabla # noch mehr Blablabla # usw... #
Es ist sehr vereinfacht gegenüber obigem Skript. Ich hab einfach überall # eingefügt. Du kannst das Problemlos in Excel laden, mit # als Trenner zwischen den Spalten und dann einfach alle Spalten ab der dritten verbinden.

Zu Deinem anderen Thread: nein, ich würde es nicht mit VBS machen face-wink hier sind Reguläre Ausdrücke das Mittel der Wahl. Und solche Aufgaben sind es, für die Larry Wall einst Perl erfunden hat.

Markus