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
Verfasst am: 01.06.2011, 09:54
Titel: Re: Spalte in *.txt mit Faktor multiplizieren
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
while1% 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
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?
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
Einstellungen und Berechtigungen
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
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.