Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
17.12.2018, 11:58:26

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 21203
  • Letzte: klaus82
Statistiken
  • Beiträge insgesamt: 561430
  • Themen insgesamt: 45517
  • Heute online: 510
  • Am meisten online: 992
  • (17.11.2018, 20:17:55)
Benutzer Online

Autor Thema: [gelöst]  Text zwischen zwei Begriffen in neue Datei kopieren  (Gelesen 480 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

[gelöst] Text zwischen zwei Begriffen in neue Datei kopieren
« am: 05.12.2018, 10:46:50 »
Linux Mint 19 Ciannmon

Hallo.
Ich habe ein kleines Problem, von dem ich vermute, dass es nicht gelöst werden kann, ich probiere es aber trotzdem mal.

Aus Windowszeiten habe ich noch eine uralte "CueCards 2000"-Datenbank  (*.cue), die ich noch immer ansehen und bearbeiten kann, indem ich das Windowsprogramm über wine aufrufe. Das möchte ich ändern, ich würde die Datenbank gern in CherryTree importieren. Das Problem dabei ist, dass aus dem Windowsprogramm heraus der einzige Export der nach html möglich ist, CherryTree aber daraus den Import lediglich in einen einzigen Knoten vornimmt.

Helfen würde, die Einträge zu trennen und in einzelne Textdateien zu schreiben, wobei ich jetzt zur eigentlichen Frage komme:

Ist es irgend wie möglich, per Befehl oder Script etliche Textbereiche, die sich jeweils zwischen zwei bestimmten Passagen (z.B. "xxxxx" und "zzzzz") befinden, auszuschneiden und in eine nur für den jeweiligen Textbereich neu erstellte Textdatei einzufügen? Zudem müsste die neue Datei nach dem Begriff aus der ersten Zeile nach der gewählten Passage ("xxxxx") benannt werden.

Bleibt noch zu erwähnen, dass ich nur über rudimentäre Kenntnisse das Scripting betreffend verfüge, eine "neuere" Version des Programms (2005) mit angeblich mehr Exportmöglichkeiten zumindest in der Sharewareversion die alte Datenbank noch nicht einmal öffnen kann und ich auch nach intensiver Suche keine andere Möglichkeit gefunden habe, die Datenbank zu konvertieren.
« Letzte Änderung: 11.12.2018, 09:05:03 von mllm »

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #1 am: 05.12.2018, 14:11:15 »
Klingt nach einer machbaren Aufgabe.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #2 am: 05.12.2018, 14:17:30 »
Tja das hängt von deinen Script/Programmier-Skills ab.

Ich weiß nicht, ob du dich an Python rantraust.

Im Kern benötigt du einen HTML/XML Parser für den Input.
Da gibt es schon was Out-of-the-Box:

https://docs.python.org/3/library/html.parser.html

Und dann natürlich bischen IO für die Dateien:
https://www.pythonforbeginners.com/files/reading-and-writing-files-in-python


Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #3 am: 05.12.2018, 18:49:27 »
oder .... Du versuchst die Datei statt mit CherryTree mit treeline zu öffnen und schaust mal, wie sie dort dargestellt wird.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #4 am: 06.12.2018, 12:22:32 »
Klingt nach einer machbaren Aufgabe
Für dich vielleicht, aber ich habe nicht den Ansatz einer Idee, wie das zu verwirklichen wäre :(
Bislang ist es mir gelungen, die Datei von sämtlichen Tags und html-Formatierungen zu befreien, auch nicht benötigte Zeilen mit unterschiedlichen Einträgen zu löschen und Beginn und Ende des einzelnen Eintrags jeweils mit einer Zeichenkette zu markieren.

das hängt von deinen Script/Programmier-Skills ab
Na, dann dürfte das nichts werden. Ein kleines Script mit wenigen Zeilen würde ich schon hinbekommen, wenn es nicht gerade Befehle erfordert, die tieferes Wissen voraussetzen. Von Python habe ich gar keine Ahnung.

treeline
Damit funktioniert leider der html-Import gar nicht. Als "Text" lässt sich die Datei öffnen, wobei da dann aber alles in einem Stück einschließlich der html-Tags angezeigt wird.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #5 am: 06.12.2018, 12:33:12 »
Deine Beschreibung ist nicht genau genug.
Poste doch mal ein typisches Stück der Datei.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #6 am: 06.12.2018, 12:55:01 »
Poste doch mal ein typisches Stück der Datei
Gern. Es handelt sich um eine Datei mit zig Englisch-Idioms, die ich im Lauf der Zeit gesammelt habe, ein Auszug (einzelne Abschnitte gekürzt):
xxxxx
awfully pretty

extremely attractive

GERMAN TRANSLATION
awfully pretty = sehr schön

EXAMPLE SENTENCE
They're AWFULLY PRETTY...

DID YOU KNOW ?
awfully pretty
...
zzzzz

xxxxx
austerity

economic living, low cost and low comfort

GERMAN TRANSLATION
austerity = die Strenge, die Knappheit, die Sparsamkeit

EXAMPLE SENTENCE
...suggested the recent downgrade of...

DID YOU KNOW
austerity
...
zzzzz

xxxxx
with alacrity

with willingness to do something quickly

GERMAN TRANSLATION
alacrity = die Eifer, die Bereitwilligkeit, die Schnelligkeit

EXAMPLE SENTENCE
Although a return may seem...

DID YOU KNOW
alacrity
...
zzzzz

Der für mich wichtige Text befindet sich zwischen "xxxxx" und "zzzzz", der Dateiname müsste das Wort sein, welches unter "xxxxx" steht, damit Cherrytree das beim Import als eigenständigen Knoten (Eintrag) erkennt und setzt.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #7 am: 06.12.2018, 14:04:23 »
Das ist ja kein HTML, dann wird das noch einfacher sein.

Bin auch nicht der Shell-Scripter vor dem Herrn.  Hab das letzte mal vor 20 Jahren was machen müssen...

Aber das Grundgerüst sollte sein:

#! /bin/bash
while read line;
   do 
       #
       # hier den code ergänzen, der auf start tag xxxxxx prüft
       # danach die zeile mit dem dateinamen einliest
       #  dann in schleife weitere zeilen einliest und in die datei schreibt
       # bis der end tag zzzzzz erreicht ist.
      echo $line;
done   < deindateiname

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #8 am: 06.12.2018, 15:40:15 »
Okay du hast meinen Ehrgeiz geweckt.

Habe das mal hier aus dem Kopf schnell runtergehackt - leider ohne Test-/Debug-/Ausführungsmöglichkeiten...

Code in Texteditor kopieren, unter script.sh speichern und mit ./script.sh < inputfile ausführen.

#! /bin/bash

# Die Tag Werte. Anpassen wenn notwendig. 
starttag = "xxxxx"
endtag = "zzzzzz"


# Temporäre Variable für das Dateinamen des Outputfiles
outputfile = ""

#Äußere Schleife liest bis zum Starttag jede Zeile aus Standardinput ein
while read line;
do 
  if ["$line" == "$starttag"]
  then
    # Dateinname soll direkt hinter dem Start Tag stehen
    read outputfile;

    # Solange das End Tag nicht erreicht lese Zeilen ein....   
    while [ read dataline ] && [ "$dataline" != "$endtag" ];
    do
      # ...und hänge sie an das Output File an.
      echo "$dataline" >> outputfile;
    done 

  fi
done


# Aufruf: ./script.sh < inputfile
« Letzte Änderung: 06.12.2018, 15:44:01 von Malvindra »

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #9 am: 06.12.2018, 21:17:48 »
Ich möchte empfehlen, mit einer Kopie der Eingangsdatei zu arbeiten.



Ich hätte da noch Fragen:

1) Da sind auch mehrere Wörter, anstatt nur eines, unter dem xxxxx, wie soll sich das auf die zu erzeugenden Dateinamen auswirken?

2) Kommen diese Wörter/Wort nur einmal vor und wenn nein, sollen die resultierenden Dateien dann erweitert werden oder eine zweite Datei mit angehängter laufender Nummer erzeugt werden?

3) Ich kann das Umlaut "ö" sehen - ist die Eingangsdatei UTF-8 ("file Dateiname" im Terminal kann Auskunft geben)?

4) Wie groß ist die Eingangsdatei? (in Kilobytes oder die Zeilenanzahl mit "wc -l Dateiname" im Terminal ermittelt)

5) Sollen die resultierenden Dateien in den aktuellen Ordner geschrieben werden?

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #10 am: 07.12.2018, 09:09:07 »
1) Da sind auch mehrere Wörter, anstatt nur eines, unter dem xxxxx, wie soll sich das auf die zu erzeugenden Dateinamen auswirken?
Um eine korrekte Bezeichnung des jeweiligen Eintrages in Cherrytree zu erreichen, müsste sich der Dateiname aus den Wörtern zusammensetzen. Sollten Leerzeichen nicht möglich sein, kann es ist auch ein Unterstrich o.ä. sein, das spätere Umbenennen bekomme ich hin.

Zitat
2) Kommen diese Wörter/Wort nur einmal vor und wenn nein, sollen die resultierenden Dateien dann erweitert werden oder eine zweite Datei mit angehängter laufender Nummer erzeugt werden?
Doppelte Einträge kommen nicht vor, allerdings enthalten die Einträge teilweise gleiche Wörter wie a, an, I, I'm, I've usw.

Zitat
3) Ich kann das Umlaut "ö" sehen - ist die Eingangsdatei UTF-8 ("file Dateiname" im Terminal kann Auskunft geben)?
Damit habe ich noch ein Problem. Ich habe die Datei abgespeichert mit UTF-8-Zeichenkodierung und Unix/Linux-Zeilenende, file zeigt aber immer "data" an. Irgend wo in der Datei müssen sich Zeichen befinden, die nicht UTF-8-konform sind. Gefunden habe ich die bislang aber nicht.

Zitat
4) Wie groß ist die Eingangsdatei? (in Kilobytes oder die Zeilenanzahl mit "wc -l Dateiname" im Terminal ermittelt)
Die Datei ist 5,4 MB groß und enthält ca. 185.000 Zeilen.

Zitat
5) Sollen die resultierenden Dateien in den aktuellen Ordner geschrieben werden?
Kann, muss aber nicht.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #11 am: 07.12.2018, 09:12:54 »
Habe das mal hier aus dem Kopf schnell runtergehackt - leider ohne Test-/Debug-/Ausführungsmöglichkeiten...
Erst einmal vielen Dank für deine Bemühungen :)

Das Script funktioniert leider nicht, es erzeugt folgende, wiederkehrende Fehlermeldungen:
./script.sh: Zeile 14: [zzzzz: Befehl nicht gefunden
./script.sh: Zeile 20: [: read: Einstelliger (unärer) Operator erwartet.
./script.sh: Zeile 14: [xxxxx: Befehl nicht gefunden
./script.sh: Zeile 14: [blowing his own trumpet: Befehl nicht gefunden
./script.sh: Zeile 20: [: read: Einstelliger (unärer) Operator erwartet.

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #12 am: 07.12.2018, 13:53:20 »
So jetzt von zuhause lauffähig gemacht...

#! /bin/bash
 
# Die Tag Werte. Anpassen wenn notwendig. 
starttag="xxxxx"
endtag="zzzzz"


#Äußere Schleife liest bis zum Starttag jede Zeile aus Standardinput ein
while read line;
do 

# Zum Debuggen entkommentieren...
#  echo $line;

  #Wenn Start Tag erkannt,
  if [ "$line" == "$starttag" ]
  then
    # Dateinname soll direkt hinter dem Start Tag stehen
    read outputfile;

# Zum Debuggen entkommentieren...
#   echo $outputfile;

    # Solange das End Tag nicht erreicht lese Zeilen ein....   
    while read dataline && [ "$dataline" != "$endtag" ]
    do
      # ...und hänge sie an das Output File an.
      echo $dataline >> $outputfile;
    done 
 fi
done

Das sind meine Testdaten als Inhalt von inputfile

xxxxx
file1

sdfsdf
sfsdfsf
sfsfs
zzzzz


xxxxx
file2

asdfsdf
asfsdfsf
asfsfs
zzzzz
« Letzte Änderung: 07.12.2018, 13:57:39 von Malvindra »

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #13 am: 07.12.2018, 15:42:00 »
Das musst Du auf einem Linux-Dateisystem machen, sonst gibt es Ärger mit den Dateinamen.
Du musst anfang, ende und datei (der Pfadname der Inputdatei) anpassen.
Die resultierenden Dateien landen im aktuellen Ordner.

#!/usr/bin/awk -f

BEGIN {

  ### Bitte anpassen:
  anfang="xxxxx"
  ende="zzzzz"
  datei="./Test.txt"
  ###

  while ((getline < datei) > 0) {
    if ($0==anfang) {rec=1;continue}
    if ($0==ende) {rec=0;continue}
    if (rec==1) {outfile=$0;print $0 > outfile;rec=2;continue}
    if (rec==2) {print $0 > outfile}
  }

}

Re: Text zwischen zwei Begriffen in neue Datei kopieren
« Antwort #14 am: 11.12.2018, 09:04:36 »
So, nach einem verlängerten, computerfreien Wochende möchte ich mich hier herzlich bedanken :)

Beide Scripte funktionieren hervorragend, wobei bei dem von Malvindra die erste Zeile und damit die Überschrift nicht übernommen wurde, was aber letztendlich auch kein Problem war, da die Möglichkeit bestand, diese zweimal an den Anfang zu stellen.

Ich habe versucht, zu verstehen, was da bei diesen wenigen Zeilen Code passiert ist, muss aber zugeben, dass mir das, insbesondere bei dem von Nessie, nicht gelungen ist.
Und da alles so gut hingehauen hat, habe ich mich gleich noch mit Erfolg an zwei weiteren alte Datenbanken versucht.

Daher noch einmal: Vielen vielen Dank für eure Hilfe!