WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Ein txt-File editieren mit Hilfe eines anderen txt-Files

 

GAST_GU

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 14:23     Titel: Ein txt-File editieren mit Hilfe eines anderen txt-Files
  Antworten mit Zitat      
Hallo allerseits,

ich habe 2 Dateien. Bestimmte Zeilen (abhängig was in der ersten und zweiten Spalte steht) der ersten Datei sollen so verändert werden, das am Anfang der Zeile ein $-Zeichen vor dem Text steht. In der anderen Datei muss man diese Informationen der ersten und zweiten Spalte herausnehmen.
Also: Datei 1: verändern und Datei 2:Info rauslesen, um zu wissen was an Datei 1 verändert werden soll!
Aus Datei 2 will ich rauslesen: Alle Zeilen in der Spalte 1 muss 'GRID' stehen. Da soll dann auch die 2.Spalte mitgenommen werden. Mit dieser Info in der Datei 1 suchen, wo diese Zeile identisch ist (mit den ersten 2 Spalten) und dort dann am Anfang den $ hinzufügen.
In der Datei 1 ist es manchmal so, dass diese eine Zeile über 2 Zeilen geht. Da hat aber immer die drauffolgende Zeile ein Plus-Zeichen (+) am Anfang. Diese Zeile müsste auch ein $-Zeichen dann davor haben.

Seit gestern sitze ich hier dran und verzweifle, habe bisher den Code zusammengebracht^^:

Code:
% fid = fopen('FM_ohne-Links.bdf'); % öffne Datei
% data = {}; % intialisiere zu lesende Daten als leeres Cell Array
% while ~feof(fid) % weiter bis zum Ende der Datei
%     l = fgetl(fid); % Zeile auslesen
%     if strcmpi(l{ }, 'GRID')
%         data = [data; textscan(l, '%s %s %s %s %s %s %s %s %s')];  
%     end
% end  

fid = fopen('FE-Delete-S14B.dat', 'rt');
C = textscan (fid, '%s %s %s %s %s %s %s %s %s')

for i = 1:size(C{1},1)
    if C{1,1}=='GR'
        A = sscanf(i, '%8s')
    end
end


% fid2 = fopen('GNSFF.SDB.SE.b', 'rt');
% C2 = textscan (fid2, '%s %s %s %s %s %s %s %s %s')

% fclose(fid2)
%
%
% % fprintf( fid2, '%-8s%8s%8s%8s%8s%8s%8s%8s%8s\n', C{1,2}, C{1,2}, C{1,3}, C{1,4}, C{1,5}, C{1,6}, C{1,7}, C{1,8}, C{1,9});
%
% fprintf( fid2, '%-8s%8s%8s%8s%8s%8s%8s%8s%8s\n', 'data');
 

Ich hoffe ihr könnt mir helfen, Vielen Dank!!!


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 07.02.2014, 18:24     Titel:
  Antworten mit Zitat      
Hallo

da musst die Datei 1 am besten komplett einlesen, und dann diese im Speicher verändern z.b durch STRREP
auf jedenfall einlesen der ersten Datei geht so:

Code:

fid = fopen('Datei1.txt')
data= textscan(fid,'%s');
data = [data{:}];
fclose(fid);
 


Die andere Datei muss man vielleicht zeilenweise einlesen, und dann die Anweisungen ausführen, bin mir nicht sicher, weil ich nicht ganz deine Ausführung verstehe.
Private Nachricht senden Benutzer-Profile anzeigen
 
GAST_GU

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2014, 10:56     Titel:
  Antworten mit Zitat      
Vielen Dank Denny, dass du geantwortet hast.
Ich habe es hinbekommen, da ich beide dateien als delimiter und string eigelesen habe, als ein cell array. Dann habe ich es als C{1} ausgelesen und es dann mit dem Befehl strncmpi die Anweisungen ausgeführt.

Vielen Dank nochmal!
 
GAST_GU

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2014, 12:08     Titel:
  Antworten mit Zitat      
Hallo allerseits,

ich hab doch noch eine Frage. Ich habe folgende Funktion:
Code:
for i = 1:length(D)
    line = D{i}; % LOOP ON i
    line_no_double_space = regexprep(line, ' +', ' ');
    if any(strncmpi(C2, line_no_double_space, 12))        
fprintf(fid_out, '%s\n', ['$ ' line]);
    else
        fprintf(fid_out, '%s\n', [line]);
    end
end
fclose(fid_out);

C2 ist meine vorher rausgelesene Datei, die genau die Zeilen beinhaltet, vor denen ein $-Zeichen stehen soll.
Die Datei, die verändert werden soll, also line-no-double-space, hat die Zeilen, die in der C2 sich befinden, aber in der line-no-datei gehen diese Zeilen manchmal über 2 Zeilen. Das heisst, dass die 2. Zeile mit einem +-Zeichen anfängt. Diese darauffolgende Zeile, die mit dem +-Zeichen beginnt, dort soll auch ein $-Zeichen vorstehen.
Daher meine Frage: Wie mache ich das genau? Ich habe eine for-Schleife, die beinhaltet aber das nicht mit den darauffolgenden Zeilen.

Bitte Leute, wäre euch sehr dankbar!
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 10.02.2014, 14:11     Titel:
  Antworten mit Zitat      
So, habe mich jetzt auch registriert...wäre euch sehr dankbar für eine Antwort! Danke....
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.02.2014, 15:39     Titel:
  Antworten mit Zitat      
Hallo

meinst du sowas:

Code:

line_no_double_space  = sprintf('A\nB')
line_no_double_space = regexprep(line_no_double_space,'\n','\n$')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 10.02.2014, 16:42     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo

meinst du sowas:

Code:

line_no_double_space  = sprintf('A\nB')
line_no_double_space = regexprep(line_no_double_space,'\n','\n$')
 


Danke Denny. Aber ich möchte nur, dass Zeilen, die mit dem 'PLUS' (+) Zeichen anfangen, auch einen $-Zeichen vor dieser Zeile stehen haben, wenn die eine Zeile davor auch ein $-Zeichen hat.
Ich habe weiter versucht und den folgenden Code hinbekommen:

Code:
for i = 1:length(D);
    line = D{i};
    line_no_double_space = regexprep(line, ' +', ' ');
    if any(strncmpi(C2, line_no_double_space, 12));
        fprintf(fid_out, '%s\n', ['$ ' line]);
        last_line_commented = 1;
    elseif strncmp(line, '+', 1);
        if last_line_commented == 1;
            fprintf(fid_out, '%s\n', ['$ ' line]);
            %last_line_commented = 1;
        else
            fprintf(fid_out, '%s\n', [line]);
            %last_line_commented = 0;
        end
    else
        fprintf(fid_out, '%s\n', [line]);
    end
end

In diesem Fall kriegt aber JEDE Zeile, die mit einem Plus (+) anfängt, einen $-Zeichen davor gesetzt. Ich möchte aber nur bei den Zeilen (die mit 'Plus' (+) anfangen) ein $ bei denen eine Zeile davor auch ein $-Zeichen ist. Bei meiner for-Schleife macht er das leider bei allen Plus-Zeichen....
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.02.2014, 17:26     Titel:
  Antworten mit Zitat      
Hallo

kannst du so eine Zeile hier posten, da leider nicht klar ist wie diese aussieht.
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 10.02.2014, 17:31     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo

kannst du so eine Zeile hier posten, da leider nicht klar ist wie diese aussieht.


Hallo, ich habe mal einen Teil kopiert:

CBAR 1904310 1528000 190430 190440 190001 +100051
+100051 0. .049726 .057617 0. .049726 .057617


Die Datei besteht aus zig-Zeilen wie solchen. Ich poste auch mal mein Gesamt-Code:

Code:
     fid = fopen('FE-Delete-S14B.dat', 'rt');
C = textscan (fid, '%s', 'delimiter', '\n');
C = C{1};
C2 ={};
for t = 1:length(C);
    tline = C{t};
    if strncmpi(tline, 'C', 1) && ~ any(strncmpi(tline, {'CORD', 'CEND'}, 4));
        C2{end+1} = regexprep(tline, ' +', ' ');
    end
end
fclose(fid);

fid2 = fopen('GNSFF.SDB.SE.b', 'rt');
D = textscan (fid2, '%s', 'delimiter', '\n');
D = D{1};
fclose(fid2);

fid_out = fopen('FE-modif-Dollar-Elemente.txt', 'wt');

for i = 1:length(D);
    line = D{i};
    line_no_double_space = regexprep(line, ' +', ' ');
    if any(strncmpi(C2, line_no_double_space, 12));
        fprintf(fid_out, '%s\n', ['$ ' line]);
        last_line_commented = 1;
    elseif strncmpi(line_no_double_space, '+', 1)
        if last_line_commented == 1
            fprintf(fid_out, '%s\n', ['$ ' line]);
            %last_line_commented = 1;
        else
            fprintf(fid_out, '%s\n', [line]);
            %last_line_commented = 0;
        end
    else
        fprintf(fid_out, '%s\n', [line]);
    end
end
fclose(fid_out);


Dieser Code funktioniert auch gut, nur, dass alle Zeilen die mit Plus anfange werden mit einem $-Zeichen davor ausgegeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.02.2014, 17:51     Titel:
  Antworten mit Zitat      
Hallo

da muss man last_line_commented wieder auf 0 setzen
Code:


fid = fopen('FE-Delete-S14B.dat', 'rt');
C = textscan (fid, '%s', 'delimiter', '\n');
C = C{1};
C2 ={};
for t = 1:length(C);
   tline = C{t};
   if strncmpi(tline, 'C', 1) && ~ any(strncmpi(tline, {'CORD', 'CEND'}, 4));
      C2{end+1} = regexprep(tline, ' +', ' ');
   end
end
fclose(fid);

fid2 = fopen('GNSFF.SDB.SE.b', 'rt');
D = textscan (fid2, '%s', 'delimiter', '\n');
D = D{1};
fclose(fid2);

fid_out = fopen('FE-modif-Dollar-Elemente.txt', 'wt');

for i = 1:length(D);
   line = D{i};
   line_no_double_space = regexprep(line, ' +', ' ');
   regexprep(line_no_double_space)
   
   if any(strncmpi(C2, line_no_double_space, 12));
      fprintf(fid_out, '%s\n', ['$ ' line]);
      last_line_commented = 1;
   elseif strncmpi(line_no_double_space, '+', 1)
     
      if last_line_commented == 1
         fprintf(fid_out, '%s\n', ['$ ' line]);
         %         else
         %             fprintf(fid_out, '%s\n', [line]);
         %             %last_line_commented = 0;
      end
      last_line_commented = 0;
   else
      fprintf(fid_out, '%s\n', [line]);
      last_line_commented = 0;
   end
end
fclose(fid_out);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 10.02.2014, 18:21     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo

da muss man last_line_commented wieder auf 0 setzen
Code:


fid = fopen('FE-Delete-S14B.dat', 'rt');
C = textscan (fid, '%s', 'delimiter', '\n');
C = C{1};
C2 ={};
for t = 1:length(C);
   tline = C{t};
   if strncmpi(tline, 'C', 1) && ~ any(strncmpi(tline, {'CORD', 'CEND'}, 4));
      C2{end+1} = regexprep(tline, ' +', ' ');
   end
end
fclose(fid);

fid2 = fopen('GNSFF.SDB.SE.b', 'rt');
D = textscan (fid2, '%s', 'delimiter', '\n');
D = D{1};
fclose(fid2);

fid_out = fopen('FE-modif-Dollar-Elemente.txt', 'wt');

for i = 1:length(D);
   line = D{i};
   line_no_double_space = regexprep(line, ' +', ' ');
   regexprep(line_no_double_space)
   
   if any(strncmpi(C2, line_no_double_space, 12));
      fprintf(fid_out, '%s\n', ['$ ' line]);
      last_line_commented = 1;
   elseif strncmpi(line_no_double_space, '+', 1)
     
      if last_line_commented == 1
         fprintf(fid_out, '%s\n', ['$ ' line]);
         %         else
         %             fprintf(fid_out, '%s\n', [line]);
         %             %last_line_commented = 0;
      end
      last_line_commented = 0;
   else
      fprintf(fid_out, '%s\n', [line]);
      last_line_commented = 0;
   end
end
fclose(fid_out);

 


Danke Denny...aber jetzt kommt immer ein Fehler mit: ??? Undefined function or variable 'last_line_commented'.

Was jetzt?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.02.2014, 18:38     Titel:
  Antworten mit Zitat      
Komisch und bei dir hat das funktioniert?
auf jedenfall muss deine Variable vor der FOR-Schleife initialisiert

Code:


fid = fopen('FE-Delete-S14B.dat', 'rt');
C = textscan (fid, '%s', 'delimiter', '\n');
C = C{1};
C2 ={};
for t = 1:length(C);
   tline = C{t};
   if strncmpi(tline, 'C', 1) && ~ any(strncmpi(tline, {'CORD', 'CEND'}, 4));
      C2{end+1} = regexprep(tline, ' +', ' ');
   end
end
fclose(fid);

fid2 = fopen('GNSFF.SDB.SE.b', 'rt');
D = textscan (fid2, '%s', 'delimiter', '\n');
D = D{1};
fclose(fid2);

fid_out = fopen('FE-modif-Dollar-Elemente.txt', 'wt');
last_line_commented = 0;
for i = 1:length(D);
   line = D{i};
   line_no_double_space = regexprep(line, ' +', ' ');
   
   if any(strncmpi(C2, line_no_double_space, 12));
      fprintf(fid_out, '%s\n', ['$ ' line]);
      last_line_commented = 1;
   elseif strncmpi(line_no_double_space, '+', 1)
     
      if last_line_commented == 1
         fprintf(fid_out, '%s\n', ['$ ' line]);
         %         else
         %             fprintf(fid_out, '%s\n', [line]);
         %             %last_line_commented = 0;
      end
      last_line_commented = 0;
   else
      fprintf(fid_out, '%s\n', [line]);
      last_line_commented = 0;
   end
end
fclose(fid_out);

 


Zuletzt bearbeitet von denny am 12.02.2014, 12:31, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 11.02.2014, 10:33     Titel:
  Antworten mit Zitat      
Vielen Dank Denny!
Ja vorher hatte es funktioniert, aber ich glaube nur deswegen, weil man der Variablen nur die '1' zugeordnet hatte, mit der '0' muss man dann schon vor der Schleife die Variable initialisieren.
Dann hat es auch funktioniert, Danke nochmal! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 11.02.2014, 11:10     Titel:
  Antworten mit Zitat      
Was ist, wenn nicht nur die darauffolgende Zeile, sondern auch die übernächste Zeile mit einem 'Plus'-Zeichen anfängt, denn die sollte dann auch ein $-Zeichen am Anfang der Zeile bekommen. In meinem Fall würde es nur die darauffolgende Zeile mit dem $-Zeichen auskommentieren. Wie kann ich es dazu bringen, dass er auch die übernächste Zeile prüft, ob es ein Plus Zeichen ist....?
Private Nachricht senden Benutzer-Profile anzeigen
 
gubii
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.02.14
Wohnort: Hamburg
Version: ab Matlab R2010b
     Beitrag Verfasst am: 12.02.2014, 10:38     Titel:
  Antworten mit Zitat      
Ich könnte ja erneut so vorgehen, dass ich noch eine Variable hinzufüge, wie ich das mit last_line_commented gemacht habe, aber das würde ja das Skript dann immer länger machen. Gibt es keine andere Variante, dass nicht nur die darauffolgende Zeile mit dem 'Plus'-Zeichen auskommentiert wird sondern auch die nächsten Plus-Zeichen??
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.