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

Spalte in *.txt mit Faktor multiplizieren

 

Matlappen
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 31.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2011, 23:06     Titel: Spalte in *.txt mit Faktor multiplizieren
  Antworten mit Zitat      
Hallo,
ich habe folgendes Problem.
Ich habe an die 100 Dateien (*.txt), die nach dem folgenden Schema aufgebaut sind:

x, y, z, pkt-nr,Datum,Bereich
3474082.580,6027615.580, -1.420, 350734.00000,20030329,17:19:02 04-03-29rt
3474080.790,6027615.580, -1.380, 350735.00000,20030329,17:19:03 04-03-29rt
3474072.630,6027616.770, -1.350, 350736.00000,20030329,17:19:08 04-03-29rt
3474063.010,6027619.860, -1.360, 350737.00000,20030329,17:19:14 04-03-29rt
3474053.170,6027621.390, -1.340, 350738.00000,20030329,17:19:20 04-03-29rt

Dabei ist der Punkt das Dezimaltrennzeichen und das Komma der Delimiter. Nun muss ich die dritte
Spalte (z) mit dem Faktor -1 multiplizieren und im gleichen Dateiformat wieder exportieren bzw. die Ausgangsdatei ändern.
Bisher bin ich so weit, als Beispiel für die Datei "test.txt". Beim Import in Matlab werden Header und Daten getrennt in die
Variablen textdata und data.


data(:,3)=data(:,3)*-1


Die Hauptprobleme sind jetzt, dass in der Ausgabedatei die Spaltenstruktur weg ist und die Ausgabewerte in diesem Format notiert sind (bislang habe ich es dlmwrite versucht):
3.4481e+006

Idealerweise sollte die Ausgabedatei so aussehen, da ich eigentlich nur die ersten drei Spalten brauche:
x, y, z
3474082.580,6027615.580, 1.420
3474080.790,6027615.580, 1.380
3474072.630,6027616.770, 1.350
3474063.010,6027619.860, 1.360
3474053.170,6027621.390, 1.340

Kann mir jemand helfen?

Vielen Dank,
Matlappen
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.06.2011, 09:54     Titel: Re: Spalte in *.txt mit Faktor multiplizieren
  Antworten mit Zitat      
Hallo Matlappen,

Zitat:
x, y, z, pkt-nr,Datum,Bereich
3474082.580,6027615.580, -1.420, 350734.00000,20030329,17:19:02 04-03-29rt

Idealerweise sollte die Ausgabedatei so aussehen, da ich eigentlich nur die ersten drei Spalten brauche:
x, y, z
3474082.580,6027615.580, 1.420

Ein Problem ist die Umwandlung von Strings in Dezimalzahlen und wieder zurück. Dabei können Rundungsfehler auftreten, die das Ergebnis leicht verändern. Es sieht aber so aus, als würde es reichen jede Zeile nur bis zum dritten Komma einzulesen und alle ",-" in ", " umzuwandeln - oder?

Dann:
Code:
FileList = {'File1.ext', 'File2.ext'};  %Dummy data
for iFile = 1:numel(FileList)
  inFile = FileList{iFile};
  outFile = strrep(inFile, '.ext', 'converted.ext');  % Oder anders
  inFID = fopen(inFile, 'r');
  if inFID < 0, error('Cannot open file %s', inFile); end
  outFID = fopen(outFile, 'w');
  if outFID < 0, error('Cannot open file %s', outFile); end
 
  while 1  % Infinite loop
    aLine = fgetl(inFID);
    if ~ischar(aLine), break; end  % End of file reached
    index = strfind(aLine, ',');
    aLine = strrep(aLine(1:index(3) - 1), ',-', ', ');
    fwrite(outFID, aLine, 'uchar');
    fwrite(outFID, 10, 'uchar');   % Or [13,10] for DOS linebreaks
  end
  fclose(inFID);
  fclose(outFID);
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlappen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 31.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2011, 11:04     Titel:
  Antworten mit Zitat      
Hallo Jan,
schon einmal vielen Dank für deine Mühe.
Das Einlesen und abspeichern funktioniert schon einmal mit deinem Code. Nur reicht es leider nicht alle ",-" in ", " umzuwandeln, da die positiven Werte in der dritten Spalte negativ werden müssen, also muss diese Spalte mit dem Faktor -1 multipliziert werden. Auch funktioniert der Zeilenumbruch in der Ausgabedatei leider nicht richtig?
Vielleicht noch eine Idee?

Gruß,
Matlappen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.06.2011, 11:39     Titel:
  Antworten mit Zitat      
Hallo Matlappen,

Zitat:
Auch funktioniert der Zeilenumbruch in der Ausgabedatei leider nicht richtig?

Was bedeutet "nicht richtig"? Es wird eine Zeile geschrieben, und danach ein CHAR(10). Dies ist der Zeilen-Trenner, denn alle Linux- und Windows-Editoren, z.B. auch der Matlab-Editor, verstehen. Nur das Notepad von Windows zickt dabei herum und besteht auf CHAR([13,10]) - daher auch der entsprechende Kommentar hinter der Zeile.

Hilft das?

Beim Einlesen von "-1.420" als Zahl wirst Du leider immer ein Problem mit der internen Rundung bekommen. Egal wie man auch immer rundet, abschneidet oder formattiert, es gibt immer eine Zahl, bei der sich die letzt Stellen nach String->Double->String geändert hat. Deshalb würd ich bei Deinem Problem die Daten im Stringformat belassen.
Du kannst nach dem zweiten Komma suchen (STRFIND) und testen, ob das Folgende Zeichen ein '-' oder '0':'9' ist und entsprechend entweder das Minus löschen oder einfügen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.