Bestimmten Text kopieren & Wort ersetzen

xoa

Enthusiast
Thread Starter
Mitglied seit
01.08.2006
Beiträge
1.036
Ort
IT
Ich möchte gerne in rund 1000 txt Dateien nach einem bestimmten Wort suchen, dieses kopieren und in der selben Datei mit der gerade kopierten Zeile/Wort eine andere Zeile/Wort überschreiben.

Code:
Number=1168889
Team="TTTRE - Krohn Barbour"
Driver="Krohn"
Description=""
Manufacturer=""

Der Inhalt von Team (also TTTRE - Krohn Barbour sollte ganz einfach kopiert werden und bei Description="" wieder eingefügt werden.

Ergenbis wäre dann Description="TTTRE - Krohn Barbour".

Kling einfach aber ich schaffs nicht. :fresse: Ich habs schon mit notepad++ versucht, dort suche ich mit Team=.* nach dem Inhalt von Team=, aber ich schaffe es nicht dies dann zu kopieren und dann wieder bei Description="" einzufügen.

Wie mache ich das am besten? :confused:
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
wenn die struktur oben immer gleich ist, könntest du es mit copy und replace machen

Einfach
Team="TTTRE - Krohn Barbour"
Driver="Krohn"
Description=""

suchen und

Team="TTTRE - Krohn Barbour"
Driver="Krohn"
Description="TTTRE - Krohn Barbour"

ersetzen
 
Ja, aber der Inhalt von Team ist immer anders, sowie auch die Struktur. Aber trotzdem schon mal Danke für deine Hilfe. ;)
 
Zuletzt bearbeitet:
Ok, dann werd ich wohl auf die gute alte Copy & Paste Methode zurückgreifen müssen. :(

Ich komm mit nem Macro mittlerweile schon soweit, dass er nach "Team=.*" sucht, dann bookmarked, in die zwischenablage kopiert, dann suche ich nach Description="" und bookmarke das, aber jetzt müsste ich nur noch irgendwie den Inhalt der Zwischenablage in das replace-Feld hineinbekommen.
 
Zuletzt bearbeitet:
Bei 1000 Dateien Copy & Paste von Hand ?
Frage: sind die alle in einem Ordner ?

Wenn ja könnt ich dir kurz n kleines Programm schreiben..... bei 1000 Dateien krepiert man ja sonst :d
 
Zuletzt bearbeitet:
Nein, die Dateien sind alle in verschiedenen Ordnern, so jeweils in 2-3 Unterordner.

Wenn du das machen könntest wäre dan natürlich hervorragend und ich wäre dir sehr dankbar. :banana:
 
Naja ich kanns ja mal versuchen.......... bin grad am einlernen in RegEx mit C# von dem her passts sogar :d

Code:
Team="irgendwas"
bla bla bla
Description=""

das ist auf jedenfall immer in den Textdateien drin ?
 
Zuletzt bearbeitet:
Aus deinem Beispiel macht mein bisheriger Ansatz folgendes:

Code:
Number=1168889
Team="TTTRE - Krohn Barbour"
Driver="Krohn"
Description="TTTRE - Krohn Barbour"
Manufacturer=""

korrekt ?
 
Zuletzt bearbeitet:
Ja genau, so sollte das sein. :banana:
 
Ok, just try it ;)

Im Anhang 2 Dateien, 1x die Exe und 1x die Config-Datei.
Beide müssen in einem Ordner liegen.
In der Config-Datei gibst du nun den Ordner an, in welchem deine Textdateien liegen.

Das Programm ersetzt nun den Inhalt der Textdateien - d.h. keine Sicherungskopie, die solltest du vorher machen ;)
Und es wird unterhalb des Ordners, den du angibst, ein Logfile namens "replacelog" gemacht, in dem alle Dateien gelistet werden, in denen etwas ersetzt wird.

Aber mach auf jedenfall vorher eine Sicherung. Ich garantiere für nichts, Benutzung auf eigene Gefahr ^^

Hier mein Programmcode, das ganze ist in C# programmiert.

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        public static string dir;
        public static Regex search;
        public static Regex replace;

        static void Main(string[] args)
        {
            dir = System.Configuration.ConfigurationManager.AppSettings.Get("dir"); // Verzeichnis aus Config lesen
            DirectoryInfo di = new DirectoryInfo(dir); // verzeichnis prüfen
            string logfilepath = di.FullName + "\\replacelog"; // Pfad zu Logfile
            StreamWriter logfile = File.CreateText(logfilepath); // Logfile erstellen

            string pattern1 = "Team=\"([^\n]*)\"(.*)Description=\"\""; // Regex Suche
            search = new Regex(pattern1,RegexOptions.Singleline); // Regex

            ListFiles files = new ListFiles(); // Alle .txt-Dateien im Ordner auswählen
            List<string> filearray = files.GetFileList(dir, false); // Pfade der txt-Dateien in ein Array speichern

            foreach (string f in filearray) // für jede Textdatei
            {
                StreamReader myFile = new StreamReader(f); // Datei bearbeiten
                string content = myFile.ReadToEnd(); // Datei lesen
                myFile.Close(); // lesen beenden
                string replace = search.Replace(content,"Team=\"$1\"$2Description=\"$1\""); // Ersetzen

                if (replace != content) // wenn etwas ersetzt wurde, also der ersetzte text nicht mit dem Original gleich ist
                {
                    StreamWriter myWriter = new StreamWriter(f, false); // Datei mit ersetztem Inhalt schreiben
                    myWriter.Write(replace);  // Inhalt schreiben                  
                    Console.WriteLine(f.ToString()); // Auf der Konsole den Pfad ausgeben
                    logfile.WriteLine(f.ToString()); // In die Logdatei den Pfad schreiben
                    myWriter.Close(); // schreiben beenden
                }
            }
            logfile.Close(); // logfile schließen
            Console.WriteLine("Ende. Enter drücken zum schließen."); // Konsolenausgabe - ende
            Console.ReadLine(); // Konsole anhalten, um Ergebnis anschauen zu können
        }
    }

    public class ListFiles // Hilfsklasse, siehe http://dotnet-snippets.de/dns/alle-dateien-eines-ordners-auflisten---c-version---SID627.aspx
    {
        /// <summary>
        /// Creates a list which contains all filenames in a specific folder
        /// </summary>
        /// <param name="Root">Folder which contains files to be listed</param>
        /// <param name="SubFolders">True for scanning subfolders</param>
        /// <returns></returns>
        public List<string> GetFileList(string Root, bool SubFolders)
        {
            List<string> FileArray = new List<string>();
            try
            {
                string[] Files = System.IO.Directory.GetFiles(Root,"*.txt");
                string[] Folders = System.IO.Directory.GetDirectories(Root);

                for (int i = 0; i < Files.Length; i++)
                {
                    FileArray.Add(Files[i].ToString());
                }

                if (SubFolders == true)
                {
                    for (int i = 0; i < Folders.Length; i++)
                    {
                        FileArray.AddRange(GetFileList(Folders[i], SubFolders));
                    }
                }
            }
            catch (Exception Ex)
            {
                throw (Ex);
            }
            return FileArray;
        }
    }
}
 

Anhänge

  • replace.zip
    3,3 KB · Aufrufe: 41
Wow :eek:, vielen Dank für deine Mühe. Werd ich sofort ausprobieren. :banana:

EDIT: Scheint noch ein kleines Problem zu geben, Pfad ist korrekt eingetragen, nur wenn ich die .exe ausführe steht "Ende. Enter drücken zum schließen", aber in den Dateien hat sich nichts geändert. ;-)

EDIT 2: Ah, Problem gefunden. Es wird nach .txt Dateien gesucht, ich hab aber .veh (sind aber im grunde .txt Dateien). Ich werd die einfach nach .txt ändern. Moment....


EDIT 3: Hat wunderbar funktioniert. Vielen Dank nochmals ;)
 
Zuletzt bearbeitet:
Ich hol den Thread nochmals hervor.


Und zwar möchte ich jetzt mehrere Zeilen ersetzen die immer das selbe Muster haben, aber in der Mitte unteschiedlich sind. Sieht folgendermaßen aus:

INSTANCE=BACKFIRE
{
MOVEABLE=TRUE
MESHFILE=LOTUS_EXIGE_BACKFIRE.GMT COLLTARGET=FALSE HATTARGET=FALSE LODIN=(0.0) LODOUT=(175.0) SHADOWRECEIVER=FALSE
}


INSTANCE=BACKFIRE
{
MOVEABLE=TRUE
MESHFILE=*
}

Dort wo der Stern * ist, steht immer etwas anderes. Der Rest ist gleich. Kann man das mit regulärem Ausdruck hinkriegen?

Vielen Dank. :)
 
Servus

Sed - An Introduction and Tutorial by Bruce Barnett
unter windows musst du doppelte anführungszeichen benutzen, nicht die einfachen wie in den beispielen
lade dir sed for Windows runter, binaries + dependencies, oder wie ich, den installer

erstelle nun ein sed skript und passe es an, speichere es als .txt o. .sed
Code:
/INSTANCE=BACKFIRE/,/}/ {
	     s/INSTANCE=BACKFIRE/INSTANCE=REBOUND/
	     s/MOVEABLE=TRUE/MOVEABLE=WHATEVER/
}



nund zuerst probelauf, dann ...
Code:
F:\tmp\sed>"C:\Program Files (x86)\GnuWin32\bin\sed.exe" -f skript.sed *.GEN | findstr "WHATEVER RE
OUND"
        INSTANCE=REBOUND
                MOVEABLE=WHATEVER
        INSTANCE=REBOUND
                        MOVEABLE=WHATEVER
                INSTANCE=REBOUND
                        MOVEABLE=WHATEVER
        INSTANCE=REBOUND
                MOVEABLE=WHATEVER
        INSTANCE=REBOUND
                        MOVEABLE=WHATEVER

F:\tmp\sed>"C:\Program Files (x86)\GnuWin32\bin\sed.exe" -i.backup -f skript.sed *.GEN

F:\tmp\sed>dir
 Datenträger in Laufwerk F: ist DATA
 Volumeseriennummer: 90FA-0800

 Verzeichnis von F:\tmp\sed

17.01.2012  00:38    <DIR>          .
17.01.2012  00:38    <DIR>          ..
17.01.2012  00:27               117 begin-end-1.sed
17.01.2012  00:38             8.258 PACECAR-2.GEN
17.01.2012  00:37             8.258 PACECAR-2.GEN.backup
17.01.2012  00:38             8.106 PACECAR.GEN
17.01.2012  00:37             8.106 PACECAR.GEN.backup
17.01.2012  00:38             8.258 sed0m9l5Q
17.01.2012  00:38             8.106 sed4WSDdy
17.01.2012  00:37             8.106 sed6OtHas
17.01.2012  00:37             8.258 sedlS5ohO
17.01.2012  00:31               117 skript.sed
              10 Datei(en),         65.690 Bytes
               2 Verzeichnis(se), 103.296.196.608 Bytes frei

also
sed -i.backupdateiendung -f deinskript *.deinedateien

brauchst nix zu kompielieren :)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh