Notepad++ Regex (Zeichen ersetzen)

SHS

Cadet 1st Year
Registriert
Aug. 2019
Beiträge
8
Hallo zusammen,

ich versuche verzweifelt einen Regulären Ausdruck für folgende Sachlage zu finden:

Mir liegt ein Textdokument mit mehreren Hunderttausend an Datensätzen vor, die wiederum jeweils mehrere Metadatenfelder besitzen.
Es geht um Angaben wie Titel einer Publikation, die Autoren, Erscheinungsjahr etc.

Nun möchte ich die Semikolons aus den Metadatenfeldern entfernen, die Mehrfacheinträge enthalten - z.B. bei den Autoren.
Ersetzt werden sollen sie durch etwas wie "Autor_1", "Autor_2" usw., wobei natürlich die Namen der Autoren erhalten bleiben, aber eben nummeriert werden sollen.

Die jeweilige Zeile (das Metadatenfeld) der Autoren wird abgekürzt mit "AU".

Ich würde mich über jeden Tipp wirklich sehr freuen.

SHS
 
Hallo SHS,
willkommen im Forum.
Falls Du wirklich Hilfe erhoffst, solltest Du erwägen mehr Information zur Verfügung zu stellen.
Handelt es sich bei der Datei um ein Semikolon-separiertes CSV-Format?

Nach den wenigen Informationen, die uns vorliegen (oder wie ich sie mir vorstelle), würde ich die Datei vermutlich mit einer höheren Sprache zeilenweise parsen, ggf. Zustände vergeben und davon abhängig Zeichenersetzungen vornehmen.
Evtl. ist es möglich, Deine Aufgabe mit einer RegEx vorzunehmen, kann aber sehr aufwändig sein.

Hab nochmal darüber reflektiert:
Der Beschreibung nach klingt die Aufgabe wie prädestiniert für 'awk'.
Nach meiner Erfahrung kann Notepad++ bei hunderttausenden Zeilen sehr langsam werden.

Falls hier jemand mit Erfahrung in awk mitliest, könnte ein Kommentar interessant sein.
 
Zuletzt bearbeitet:
Hallo Phrasendreher und Scientist,

vielen Dank schon einmal für die schnellen Antworten.
Das Textdokument ist bereits geparst, soll aber, um es einem anderen Kontext hinzuzufügen, entsprechend homogenisiert werden. Im Zuge dessen sollen die Semikolons verschwinden und die Mehrfacheinträge in Einzelfelder aufgespalten werden.

Das müsste doch mit RegEx möglich sein, auch wenn es Wartezeit in Anspruch nehmen würde.

Ich habe einen fiktiven Datensatz beigefügt - zum hoffentlich besseren Verständnis.
 

Anhänge

  • Dummy.txt
    189 Bytes · Aufrufe: 377
Sry, da werde ich nicht weiterhelfen können; arbeite zwar seit vielen Jahren mit N++ und suche gelegentlich auch mit RegEx darin, aber hab es noch nicht so eingesetzt.

Wenn ich im "Replace"-Dialog ein einfaches Beispiel eintrage:
Find what: (^AU\s.*);
Replace with: $1Autor_1

dann bin ich nicht in der Lage, Pattern Modifier anzubringen, welche global/ungreedy arbeiten; so wird immer nur ein Semikolon ersetzt (und das Problem der Nummerierung ist dabei noch garnicht angefasst).

Ein kurzes Skript in Perl, Python oder PHP könnte die Aufgabe in meiner Welt vmtl. einfacher lösen.
 
Vielen Dank dennoch für deine Mühen. :)
 
Ich glaube, das dynamische Nummerieren wird in RegEx eher aufwendig. Als Workaround mit RegEx hätte ich noch folgenden Vorschlag:
Du kannst die Listen mehrfach durchgehen für eine feste Anzahl an Autoren. Vermutlich wird ab fünf irgendwann Schluss sein bzw. der gute Herr Et Al. auftreten.
In dem Fall dann einfach
AU ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*)\r\n
EDIT: Es muss hinter jede schließende eckige Klammer ein *, die Forumssoftware schmeißt mir das irgendwie raus. Mit plain-Tag klappt's aber.
durch
AU1 $1\r\nAU2 $2\r\nAU3 $3AU4 $4AU5 $5\r\n
ersetzen. Und so weiter verfahren mit eben immer weniger Autoren bis runter auf zwei. Die Zeilenendzeichen müssen natürlich je nach System angepasst werden.
Oder halt doch mit einer Programmier-/Skriptsprache in einem Rutsch.[/plain][/COLOR]
 
Zuletzt bearbeitet: (Mit [plain]-Tags funktionieren die Sternchen)
  • Gefällt mir
Reaktionen: Scientist
Also wenn du willst kannst du kurz ne Pn mit der vollen Datei schicken und ich lass ein Script drüberrammeln, schreib noch kurz dazu was wie wo ersetzt werden soll. Kein Grund dass du dir da jetzt den Klickfinger abnutzt, für mich sinds 2 Minuten...
 
Hallo simpsonsfan,

vielen Dank. :) Leider funktionieren die Befehle so nicht für mich - es werden 0 Einträge ersetzt.
Ich mache bestimmt etwas falsch ... ?

Danke auch an Dich, Mambokurt, für das nette Angebot. Aber ich brauche auf jeden Fall den funktionierenden RegEx-Befehl. Mal davon ab, dass die Datei dem Datenschutz unterliegt und ich die gar nicht herausgeben darf.
 
Es wurde doch bereits erläutert, dass RegEx der falsche Ansatz ist. Mach das mit einer Programmier-/Skriptsprache und es wird trivial.

Für jede Zeile liest du die ersten beiden Zeichen ein, um zu entscheiden, was für ein Attribut das ist. Auf den Rest der Zeile lässt du eine Schleife laufen, die das nächste Semikolon sucht, replaced und den Zähler hochzählt, bis keine Semikolons mehr da sind.
 
Ich stimme den anderen zu, dass RegEx eigentlich nicht der richtige Weg ist. Bin aber der Meinung, dass es damit dennoch fix geht, wenn (wie von mir vermutet) die Anzahl an Autoren begrenzt ist.
Oben hat sich in dem Suchstring bei mir ein Fehler eingeschlichen, die Zeichengruppen [^;] müssen natürlich beliebig oft vorkommen, nicht nur einmal, also müssen Asteriske dahinter. Zudem geht der Ausdruck davon aus, dass nach jedem Semikolon ein Leerzeichen folgt, das nicht mit in die neue Zeile eingefügt werden soll. Für die Dummy.txt mit drei Einträgen sieht das für Notepad++ dann konkret so aus:
AU ([^;]*); ([^;]*); ([^;\n]*)\r\n
durch
AU1 $1\r\nAU2 $2\r\nAU3 $3\r\n
ersetzen.
 
Zuletzt bearbeitet: (Mit [plain]-Tags funktionieren die Sternchen)
Nochmals vielen Dank. :)
Leider werden nach wie vor 0 Einträge ersetzt - sowohl im Dummy, als auch dem Original.

Ich bin auch leider totaler Laie was das anbelangt, kann aber verstehen, dass es bedeutend leichtere Wege für dieses Anliegen gibt. Aber möglich ist es ja ...

edit: Im Dummy ging es jetzt doch mit den Sternchen hinter den character-groups. Ich probiere es weiter. :)
 
Also vom Prinzip her funktioniert es. 👍

Allerdings sind teilweise über 10 (leider kein et al.) einzelne Angaben in den Metadatenfeldern.
Wenn ich den Befehl dann drüber laufen lasse, sieht es aus wie im Screenshot.

Woran könnte das liegen?

Bei laufender Nr.8 hört es dann auf und die restlichen Angaben werden unten ohne Nr. angehängt.
 
Zuletzt bearbeitet:
Welche Version von Notepad++ verwendest du? Es sollte eigentlich auch bei mehr als 9 Capture-Groups funktionieren. Bei mir funktioniert bspw. folgendes für 10 Einträge wie gewünscht:
AU ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*); ([^;\n]*)\r\n
ersetzen durch
AU1 $1\r\nAU2 $2\r\nAU3 $3\r\nAU4 $4\r\nAU5 $5\r\nAU6 $6\r\nAU7 $7\r\nAU8 $8\r\nAU9 $9\r\nAU10 $10\r\n
Ist deine Beispielzeile eigentlich nach den neun Einträgen dort zuende? In dem Fall solltest du bei einer Suche nach 10 Einträgen nämlich keinen Treffer landen und somit nichts ersetzt werden. Schalte doch am besten mal bei den Nicht-lesbaren-Zeichen die Zeilenendzeichen ein.
 
Dein Befehl funktioniert auf jeden Fall, dafür möchte ich dir ganz herzlich danken! :)

Aus irgendeinem Grund nur nicht in der Ursprungsdatei - ich werde das weiter ausprobieren müssen.
Vielleicht habe ich das Maximum an Einträgen noch nicht entdeckt ...
 
Zurück
Oben