• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Leerzeichen und Tabs aus Textdatei entfernen...

jengelh schrieb:
Wie wär's mit ... ?
Code:
perl -e '$_=join"",<>;s/\n\t\t//gs;s/\t//gs;print' <test
Is ganz einfach -- totaaaaal straightforward.
Code:
$_=join"",<>
Alle Zeilen (<>) per leeren String "" joinen und in $_ speichern
Code:
s/.../
Alles ungewollte rausreißen
Code:
print
und drucken. Ich versteh' immer nicht, warum einige Leute soviele Umwege machen... BTW, schonmal was von Perlgolf gehört? Ne? Na dann angucken!
 
OP
R

rethus

Advanced Hacker
Rückmeldung:

@sc_m:
Du bist mit der Version :
Code:
sed -ne '/^\t\t/{H;x;s/\n\t\t/ /;x;D}; x; 2,$p'
absolut nah dran. Ist der Text in einer Zeole mehrspaltig, werden ab der 2. UZeile alle restlichen Zeilen zusammengefasst... jedoch ist zwischen der ersten und 2. Zeile immernoch ein Umbruch.

@abgdf:
Wenn ich dein Script ausführe erhalte ich folgende Meldung:
Code:
./convert.py text1.txt text2.txt
Traceback (most recent call last):
  File "./convert.py", line 4, in ?
    f=file("in","r")
IOError: [Errno 2] No such file or directory: 'in'

@jengelh:
mit deiner Version
Code:
perl -e '$_=join"",<>;s/\n\t\t//gs;s/\t//gs;print' <test
bist du genauso nah dran wie sc_m, denn dort ist die Datei nach dem Umbau genauso aufgebaut (Umbruch zwischen 1. und 2. Zeile)

@abgdf & jengelh:
Das Perlscript wirft in beiden Varianten folgenden Fehler aus:
Code:
Died at ./convert.pl line 5.

FAZIT:
MIr scheint die Version mit sed bzw. der Perl-Zeile irgendwie am angenehmsten zu sein. Wenig schreibarbeit, hoher effekt. Zudem kann ich dann ncoh leicht andere Kommandos ergänzen....

Allerdings müsste ich es nun nur noch hinbekommen, dass die 2. und 2. Zeile einer Beschreibung nicht getrennt werden. Dann ist es optimal.

Habt Ihr da noch ne Idee?
 

abgdf

Guru
Hallo rethus,

in meiner Python-Version bekommst Du den Fehler, weil Du in der Zeile
Code:
f=file("in","r")
erst den Namen Deiner umzuwandelnden Datei im Skript eintragen mußt, z.B. als
Code:
f=file("/home/user/mydatei","r")
Gleiches gilt für die längere Perl-Version, die jengelh zitiert hatte:
Code:
open (F, "in") or die;
zu z.B.
Code:
open (F, "/home/user/mydatei") or die;
Ich weiß ja nicht, wie Deine Datei heißt.
Ich fände es aber auch völlig ok, wenn Du jengelh's Einzeiler nähmest; der ist schon brilliant ...

Viele Grüße
 

sc_m

Member
rethus schrieb:
Ist der Text in einer Zeole mehrspaltig, werden ab der 2. UZeile alle restlichen Zeilen zusammengefasst... jedoch ist zwischen der ersten und 2. Zeile immernoch ein Umbruch.
In der echo-Ausgabe von oben werden durchaus die ersten beiden Zeilen zusammengefasst. Ich schätze, mir ist nicht klar, was du meinst (und jengelh vermutlich auch nicht, wenn wir beide das gleiche machen).
Du solltest vielleicht einmal eine echo-taugliche Zeile liefern, mit entsprechenden \n und \t, und dazu schreiben, was herauskommen soll.
 
OP
R

rethus

Advanced Hacker
In meinem 5. Posting (dieses Beitrags) habe ich versucht die Sache zu visualisieren.

Quelltext:

Code:
Bezeichner: Beschreibung-1.Zeile....balaBlaa \n
\t\t Beschreibung -2.Zeile....blah....bla...\n
\t\t Beschreibung -3.Zeile....blah....bla...\n
Nun sollen die Beschreibungszeilen alle zusammengefasst werden.
Mit den aktuellen "KURZ-Befehlen" sed und perl... wird jedoch nur die Beschreibunszeile 2 und 3 zusammengefasst. Hinter der Beschreibungszeile 1 ist immer noch ein umbruch....

Hoffe das war verständlicher.
 

sc_m

Member
jengelh schrieb:
Ich versteh' immer nicht, warum einige Leute soviele Umwege machen...
Wenn du damit die sed-Variante meinst, sie hat immerhin den Vorteil, dass sie nicht erstmal die ganze Datei einliest und dann per regexp darauf losgeht, sondern zeilenweise arbeitet. Wenn du das mit Perl machen willst, wird die Vorgehensweise vermutlich ganz ähnlich sein, aber nicht so kurz.
 

sc_m

Member
Wenn du dein Browserfenster breit genug machst, dann wirst du vermutlich sehen, dass alle drei Zeilen zusammengefasst sind. Sieh dir deine Daten einmal mit "hexdump -c" an, vielleicht sehen die ein wenig anders aus, als du denkst.
Code:
ada@barnabas:~> echo -e "Bezeichner: Beschreibung-1.Zeile....balaBlaa \n\t\t Beschreibung -2.Zeile....blah....bla...\n\t\t Beschreibung -3.Zeile....blah....bla...\n " | sed -ne '/^\t\t/{H;x;s/\n\t\t/ /;x;D}; x; 2,$p'
Bezeichner: Beschreibung-1.Zeile....balaBlaa   Beschreibung -2.Zeile....blah....bla...  Beschreibung -3.Zeile....blah....bla...
 
OP
R

rethus

Advanced Hacker
Ich hab da auch noch ne andere Möglichkeit gefunden, denn wenn ich den Spaß in Openoffice kopiere, und dann den Zeilenumpruch sichtbar mache, sehe ich das nach der ersten Beschreibungszeile ein Umbruch ist.

hexdump -c text2.txt ergibt:
D e f i n i t i o n B a s i
0000060 s a t t r i b u t \t : \t U n t e
0000070 r n e h m e n s k e n n z e i c
0000080 h e n L A G e r . \n B e z
0000090 e i c h n e t z u s a m m e n
00000a0 m i t d e r F i l i a l n u
00000b0 m m e r d e s.... usw.

Der Fett markierte Zeilenumbruch ist Fehl am Platz....
 

sc_m

Member
rethus schrieb:
[...] sehe ich das nach der ersten Beschreibungszeile ein Umbruch ist.
Natürlich, denn eine Zeile ohne Umbruch ist kein Zeile. :D

Dann will ich das Kommando noch einmal ergänzen. Es sucht nach "Def" am Zeilenanfang und hängt dann immer die nächste Zeile an. Außerdem werden jetzt alle Tabulatoren ersetzt. Es geht allerdings schief, wenn die letzte Zeile der Datei mit "Def" beginnt.
Code:
sed -ne '/^Def/{N;s/\n/ /};/^\t\t/{H;x;s/\n//;x;D}; x; 2,${s/\t\+/ /g;p}'
 

abgdf

Guru
Hallo rethus,

leider komme ich mit meinen zeilenweise arbeitenden Skripten in Schwierigkeiten, wenn - wie in dem Beispiel - nacheinander mehrere Zeilen folgen, die "\t\t" enthalten :cry:.

Ich wechsele daher auch zu nur einem String für die ganze Datei. Dadurch wird es sehr kurz.

Zudem müssen die Ein-/Ausgabedateien jetzt nicht mehr unmittelbar in das Skript eingetragen werden.
Vielmehr muß es jetzt, wie oben schon gemacht, z.B. mit "./convert.py text1.txt text2.txt" aufgerufen werden.

Code:
#!/usr/bin/env python
# -*- coding: utf8 -*-

from sys import argv, exit
from os import getcwd

if len(argv) < 3:
    print '\nBitte geben Sie die Namen der Ein- und Ausgabedateien in dem Format "convert.py text1.txt text2.txt" ein; Abbruch.\n'
    exit(1) 

f=file(getcwd()+"/"+argv[1],"r")
a=f.readlines()
f.close()

c=""

for i in a: 
    c=c+i   

c=c.replace("\n\t\t","")
c=c.replace("\t","hallo")

f=file(getcwd()+"/"+argv[2],"w")
f.write(c)
f.close()

Viele Grüße
 
Mine works for me
Code:
01:04 shanghai:~ > cd /dev/shm
01:04 shanghai:/dev/shm > cat >test

Zeile
                zweitabsvormir

Sosnt
noch
        was
sont
nix
01:04 shanghai:/dev/shm > perl -e '$_=join"",<>;s/\n\t\t//gs;s/\t//gs;print' <test

Zeilezweitabsvormir

Sosnt
noch
was
sont
nix
 
OP
R

rethus

Advanced Hacker
@abgdf:
Du hast das Problem mit deinem python-Script gelöst.
Soweit ich das sehen kann, habe ich jetzt genau das Ergebnis, das ich haben wollte.
Naja, bis auf das "Hallo" in den Texten :wink:
Vielen Dank für Eure Mühen....

PS: Mich würde jetzt mal interessieren, wo der unterschied in der Verarbeitung mit python und dem sed-Befehl liegt...
 

abgdf

Guru
Oh entschuldige, das "Hallo" kam noch vom Testen.
Ändere einfach die Zeile

Code:
c=c.replace("\t","hallo")

zu

Code:
c=c.replace("\t","")

Viele Grüße
 

sc_m

Member
rethus schrieb:
Ist der Text in einer Zeole mehrspaltig, werden ab der 2. UZeile alle restlichen Zeilen zusammengefasst... jedoch ist zwischen der ersten und 2. Zeile immernoch ein Umbruch.
[...]
Mich würde jetzt mal interessieren, wo der unterschied in der Verarbeitung mit python und dem sed-Befehl liegt...
Ich habe mir das noch einmal angesehen. In dem sed-Befehl war folgender Fehler: wenn die letzte Zeile eingerückt war, dann wurde die letzte Ausgabe verschluckt. Aber das war ja eigentlich nicht das, was du beklagtest. Wenn ich diesen Fehler korrigiere und außerdem dafür sorge, dass jetzt alle Tabulatoren entfernt werden, dann lande ich bei
Code:
sed -ne '/^\t\t/{H;x;s/\n\t\t//;x;$ !D}; x; 2,${s/\t//g;p}'
Die Ausgabe für deine Testdaten stimmt genau mit der des Python Codes überein.
 
OP
R

rethus

Advanced Hacker
Nun bitte noch eine kleine Ergänzung....

Ich würde gerne jeden Beschreibungsblock in eine eigene Tabelle packen.

Beschreibungsblock:
Code:
FILLAG
Attribut KLPO_FilialeLager
Definiert durch Basisattribut	:	FilialeLager
Definition Basisattribut	:	Filialnummer der Lagerstätte. Bezeichnet zusammen mit dem Unternehmenskennzeichen (UKZLAG) eindeutig das Lager. Standardbestandteil des Primärschlüssels der meisten LVS-Tabellen.
Einschränkung Wertebereich	:	Wird in den LVS-Programmen durch eine Parameterdatei beim Start der Server-Programme eingestellt.

Könnt Ihr mir noch kurz verraten, wie ich in Phyton folgende Bedingung beschreibe:

Wenn in der Zeile "Einschränkung Wertbereich" steht, schreibe hinter dem folgendem "\n" noch den Tabellenabschluss & neubeginn: "</td></tr></table><table><tr><td>"
 

abgdf

Guru
Hi,

das sollte klappen:

Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sys import argv, exit
from os import getcwd

if len(argv) < 3:
    print '\nBitte geben Sie die Namen der Ein- und Ausgabedateien in dem Format "convert.py text1.txt text2.txt" ein; Abbruch.\n'
    exit(1)

f = file(getcwd() + "/" + argv[1], "r")
a = f.readlines()
f.close()

c=""

for i in a:
    if i.find("Einschränkung Wertebereich") != -1:
        i += "</td></tr></table><table><tr><td>\n"
    c += i   

c = c.replace("\n\t\t", "")
c = c.replace("\t", "")

f = file(getcwd() + "/" + argv[2], "w")
f.write(c)
f.close()

Bitte denke aber daran, daß dieses Forum zumindest nach meiner Meinung nicht zur kostengünstigen Beschaffung spezieller Softwarelösungen für die gewerbliche Wirtschaft bestimmt ist.

Gruß
 
OP
R

rethus

Advanced Hacker
Hallo zusammen...

danke nochmals für Eure Hilfe. Das Script ist nun weitaus größer geworden, als zu beginn geplant...
Es tut seinen Zweck wunderbar...

@abgdf:
Ich verstehe schon was du damit meinst, das man sich nicht komplette Softwarelösungen kostenfrei von anderen zusammenbauen lässt, und diese dann vermarktet....
Allerdings ist dies hier auch nicht der Fall... zudem handelt es sich auch eher um ein klitzi-kleines Script.... Das nun übrigens zu einem Großen geworden ist... (das heißt ich hab noch ne Menge dabei gebastelt, weil ich so langsam durchblicke...)
Du siehst, ich möchte mir hier keine Schlüsselfertige Lösung präsentieren lassen, sondern die Matierie verstehen, und daraus lernen... und dies ist - so denke ich - doch der Sinn eines Forums... Dabei ist es absolut egal, ob man seine Erkenntnisse nun komerziel benötigt, oder zum basteln zuhause... solange es sich nur um verständnishilfen handelt.

Und ich persönlich denke, das hier so einige Admins sind, die probleme mit Ihrem (gewerblichen [ob selbstständig, oder festangestellt ist ja egal]) Servern hier zur Sprache bringen... und das finde ich auch ok...

Ich helfe entsprechend meinem KnowHow auch gerne, wenn derjenige dann komeziellen Nutzen hat... Schließlich ist das ja auch der Gedanke der unserem faforisierten Betriebssystem (Linux) in Form von Opensource zugrunde liegt, nicht wahr? :wink:

Dieser Thread kann nun geschlossen werden...
 
Oben