ubuntuusers.de

bestimmten Text in Datei finden und Text hinzufügen

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

mlrSRT8

Anmeldungsdatum:
24. Juli 2009

Beiträge: 4

Hallo liebe Community,

es ist für mich das erste Mal, dass ich hier im Forum eure Hilfe benötige. Bis jetzt war ich immer nur fleißiger Leser 😀

ich bin auf der Suche nach einem einfachen Weg in einer Textdatei einen bestimmten Text zu finden und diesen dann um weiteren Text zu ergänzen.

Ich hab ein wenig gegooglet, was ich fand waren sed oder awk Skripte, welche aber nur Texte ersetzte...

Zur Geschichte:

Ich habe mittels Joomla eine Website erstellt welche u.A. auch ein Business Directory beinhaltet (ZOO Komponente). Mittels CSV Import habe ich meine Firmendaten importiert (Name, Adresse, Produkte, Mail, Website, usw.) –> Problem: Business Directory funktioniert 1A, jedoch öffnet sich der Link zu der jeweiligen Firma nicht in einem neuen Fenster. Der ZOO Support meinte ich müsste es manuell bei jedem einzelnen Eintrag umstellen (mach ich bei 360 Unternehmen fix nicht 😉 ) Auch ein Umweg über ein Javascript wollte nicht funktionieren ☹

Daraufhin dachte ich mir, ich stelle nur eine Firma manuell um und sieh mir das Ergebnis in der Datenbank / Tabelle genauer an.

In der SQL Datei wird nach folgendem Eintrag

"value": "http:\\/\\/www.WEBSITENAME"\n

folgender "Text" ergänzt um den Link in einem neuen Fenster zu öffnen:

"target": "1",\n

Ich habe die Tabelle als SQL Datei abgespeichert.

Wie schaffe ich es nun, dass mittels Skript nach der jeweiligen URL in meiner SQL-Datei gesucht wird und sobald diese gefunden wurde, der "target-Text" hinzugefügt wird? Geht das überhaupt?

Ich hoffe ihr konntet mir bei meinem "kleinen" Problem weiterhelfen...wäre sehr dankbar über eure Hilfe!!

Lg Michael

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

mlrSRT8 schrieb:

es ist für mich das erste Mal, dass ich hier im Forum eure Hilfe benötige. Bis jetzt war ich immer nur fleißiger Leser 😀

Oh ja, und das wohl recht ausdauernd - wenn ich so auf Dein Anmeldedatum schaue. ☺

ich bin auf der Suche nach einem einfachen Weg in einer Textdatei einen bestimmten Text zu finden und diesen dann um weiteren Text zu ergänzen.

Ich hab ein wenig gegooglet, was ich fand waren sed oder awk Skripte, welche aber nur Texte ersetzte...

Schon ganz gut.

In der SQL Datei wird nach folgendem Eintrag

"value": "http:\\/\\/www.WEBSITENAME"\n

folgender "Text" ergänzt um den Link in einem neuen Fenster zu öffnen:

"target": "1",\n

Ich habe die Tabelle als SQL Datei abgespeichert.

Was genau ist eine "SQL-Datei"? Du hast die Daten vermutlich exportiert, oder? Das Format sieht ein bisschen nach JSON aus...

Wie schaffe ich es nun, dass mittels Skript nach der jeweiligen URL in meiner SQL-Datei gesucht wird und sobald diese gefunden wurde, der "target-Text" hinzugefügt wird? Geht das überhaupt?

Also, ohne weitere Informationen klingt es, als ob folgendes die Anforderungen erfüllt:

1
sed '/^"value": / s#$#"target": "1",#'

Mich macht allerdings misstrauisch, dass am Ende der Zeile mit "value", die Du oben zeigst, kein Komma steht. Ggf. wäre es besser, mal eine komplette Datei zu zeigen - ggf. auch auf wenige Einträge gekürzt. Dann sieht man besser, was Sache ist.

Wenn es wirklich JSON ist, dann kann man natürlich auch noch andere Dinge tun. Z.B. in Ruby:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
irb(main):006:0> require 'json'
=> true
irb(main):007:0> str = '[{"value":"http://www.abc.de"},{"value":"http://www.google.de"}]'
=> "[{\"value\":\"http://www.abc.de\"},{\"value\":\"http://www.google.de\"}]"
irb(main):008:0> dat = JSON.load(str)
=> [{"value"=>"http://www.abc.de"}, {"value"=>"http://www.google.de"}]
irb(main):009:0> dat.each {|x| x["target"] = "1"}
=> [{"value"=>"http://www.abc.de", "target"=>"1"}, {"value"=>"http://www.google.de", "target"=>"1"}]
irb(main):010:0> puts dat.to_json
[{"value":"http://www.abc.de","target":"1"},{"value":"http://www.google.de","target":"1"}]
=> nil

Ciao

robert

mlrSRT8

(Themenstarter)

Anmeldungsdatum:
24. Juli 2009

Beiträge: 4

Danke für die prompte Antwort!

Was genau ist eine "SQL-Datei"? Du hast die Daten vermutlich exportiert, oder?

Also zur SQL-Datei. Ich vermute mal ich war da ein wenig kreativ und hab das Wort erfunden. Wenn ich SQL-Datei sag, dann meine ich die von phpMyAdmin exportierte Datei im SQL-Format. Ich hoffe ich habe mich jetzt korrekt ausgedrückt, hehe 😛

Im Anhang hab ich mal ne Vorschau hochgeladen als Textdatei. Ich habe die Firmendaten mit NAME, STRASSE, LINK, usw. überschrieben.

Lg

vorschau.txt (2.5 KiB)
kurze Vorschau von einem Unternehmen
Download vorschau.txt

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

mlrSRT8 schrieb:

Danke für die prompte Antwort!

Danichfür.

Was genau ist eine "SQL-Datei"? Du hast die Daten vermutlich exportiert, oder?

Also zur SQL-Datei. Ich vermute mal ich war da ein wenig kreativ und hab das Wort erfunden. Wenn ich SQL-Datei sag, dann meine ich die von phpMyAdmin exportierte Datei im SQL-Format. Ich hoffe ich habe mich jetzt korrekt ausgedrückt, hehe 😛

Achso, ja, das ist wirklich eine Datei mit SQL-Statements. 😬

Im Anhang hab ich mal ne Vorschau hochgeladen als Textdatei. Ich habe die Firmendaten mit NAME, STRASSE, LINK, usw. überschrieben.

Ohgott, das sieht ja fies aus. Das ist wirklich JSON in VARCHAR-, CLOB- oder BLOB-Spalten. Das wird haarig. Die sauberste Lösung wäre sicherlich, das in einer Skriptsprache mit JSON-Unterstützung zu machen

  1. auf die DB connecten (welches Modell eigentlich?),

  2. Werte lesen,

  3. mit einem JSON-Parser parsen (siehe mein Beispiel in Ruby),

  4. dann zu manipulieren (d.h. das "target"-Feld hinzufügen),

  5. wieder in Text verwandeln,

  6. der DB einen UPDATE schicken.

Quick and dirty:

1
ruby19 -pe '$_.gsub!(/("value": "http:(?:.(?!"target":))*?)(\\n\s+\})/, "\\1,\\n\"target\":\"1\"\\2")' daten.sql >daten-2.sql

Das tut grob gesagt folgendes:

  1. Die Datei wird zeilenweise gelesen, jede Zeile landet in $_.

  2. Dann wird eine Ersetzung mit regulärem Ausdruck gemacht.

  3. Das "-p" bewirkt nach Abarbeitung die Ausgabe von $_.

Der reguläre Ausdruck sucht nach <"value": "http> gefolgt von Zeichenfolgen, die nicht "target" enthalten, bis zum nächsten "\n }". Davor wird dann <,\n"target": "1"> eingefügt.

Vorsicht, das ist natürlich nur wenig getestet. Und du benötigst Ruby 1.9.* dafür.

Ciao

robert

mlrSRT8

(Themenstarter)

Anmeldungsdatum:
24. Juli 2009

Beiträge: 4

Danke für deine schnelle Hilfe!

Ich werde heute die "Quick and Dirty" - Methode mal ausprobieren. Das Ruby 1.9.x, brauch ich das am Server oder auf meinem PC ??

Lg Michael

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

mlrSRT8 schrieb:

Ich werde heute die "Quick and Dirty" - Methode mal ausprobieren. Das Ruby 1.9.x, brauch ich das am Server oder auf meinem PC ??

??? Es ist wie immer: Du brauchst das Programm auf dem Rechner, auf dem Du es ausführen möchtest. Ganz einfach.

Ciao

robert

mlrSRT8

(Themenstarter)

Anmeldungsdatum:
24. Juli 2009

Beiträge: 4

??? Es ist wie immer: Du brauchst das Programm auf dem Rechner, auf dem Du es ausführen möchtest. Ganz einfach.

Stimmt, Ja, is klar. Sorry für die blöde Frage ^^

1
ruby19 -pe '$_.gsub!(/("value": "http:(?:.(?!"target":))*?)(\\n\s+\})/, "\\1,\\n\"target\":\"1\"\\2")' daten.sql >daten-2.sql

Ja, Super hat funktioniert!! DANKESCHÖN !!!!

Lg Michael

Antworten |