Hallo, ich habe in einer Anwendung einen Spannungsverlauf mit einer Abstastrate von 40 kHz aufgezeichnet. Als Ergebnis erhalte ich ein ca. 150 MB großes .dat-File, bestehend aus zwei TAB-getrennten Spalten (Zeit und Spannungswert). Mein Ziel ist es diesen Datensatz um den Faktor 20 durch Mittelwertbildung zu reduzieren. Die Abtastrate im Vorfeld herunterzusetzen ist nicht gewollt, da über die Mittelwertbildung gleichzeitig Tiefpassverhalten realisiert wird, um das Messrauschen zu verringern. MatLab steht hierbei nicht zur Verfügung, für Excel ist der Datensatz zu groß. Gibt es eine Möglichkeit (Software oder Skript), dieses Problem zu lösen? Vielen Dank im Voraus.
Sicher, daß Excel damit nicht klar kommt? Wundert mich. AWK wäre eine elegante Lösungsmöglichkeit.
Manu F. schrieb: > Gibt es eine Möglichkeit (Software oder Skript), dieses Problem zu > lösen? dürfte mit jeder Sprache machbar sein. Auf die schnelle würde ich es mit Perl machen. Welche Sprachen kannst du?
Bei den Sprachen bin ich flexibel, würde mir zur Not auch eine draufschaffen. Was mir aber noch wichtig ist: Es wäre gut, wenn man das Skript als ausführbare Datei (wie z.B. .exe) abspeichern kann, sodass man künftig nur noch einen neuen Datensatz erstellen muss und mittels eines Klicks auf das Programm diesen kürzen kann. Ist sowas bei Pearl oder AWK möglich? Was wären ggfs. Alternativen?
wenn du die daten im txt file oder so speicherst, ließ sich mit fileoperatoren (c/c++ what ever) ziemlich einfach der dateneinsatz stück für stück einlesen und mitteln... oder nicht? :-)
Manu F. schrieb: > Ist sowas bei Pearl oder AWK möglich? Was wären ggfs. Alternativen? Wenn ich deine Anforderung richtig verstehe, willst du einen Datensatz einlesen, ihn verarbeiten, und das Ergebnis wieder schreiben. Ich sach mal so: Dafür wurden Computer erfunden, und das geht mit jeder seit der Erfindung der Computer erfundenen Programmiersprache. Nimm, was immer du verfügbar hast, kennst, und was .exe-Files erzeugen kann. Oliver
Oliver schrieb: > > Nimm, was immer du verfügbar hast, kennst, und was .exe-Files erzeugen > kann. Oder auch das, was keine *.exe-Files erzeugen kann. Die Verarbeitung von Datensätzen ist nicht von einer *.exe abhängig. Selbst mit einem Basic-Interpreter oder einer Scriptsprache läßt sich sowas machen. Allgemein gesagt, irgend eine Programmiersprache, die Files lesen und schreiben kann.
Und selbst wenn man kein .exe hat, kann man immer noch eine .bat/.sh schreiben und in ein Tools Verzeichnis packen, das im Pfad ist und damit dann auch einen etwas umständlicheren Aufruf verpacken.
Hallo, kennst du DIAdem von National Instruments. Testversionen mit begrenzter Laufzeit gibt es davon kostenlos. DIAdem kann mit *.dat - Dateien umgehen, kann große Datenbestände und bietet ein reduzierendes Laden von Kanälen an.
Manu F. schrieb: > Die Abtastrate im Vorfeld > herunterzusetzen ist nicht gewollt, da über die Mittelwertbildung > gleichzeitig Tiefpassverhalten realisiert wird, um das Messrauschen zu > verringern. wäre es nicht ein guter Ansatz, das gleich bei der Messwerterfassung zu erledigen? 7,5MB Daten anstatt 150MB sind doch viel einfacher bei der Erfassung zu handeln. Mittelwert bilden geht auch bei der Erfassung, und macht da imho mehr Sinn als danach. 20 Werte addieren und dann durch 20 teilen kannst du in jeder Sprache, welche beherrschst du denn? Wenn du selbst mit einer anfangen willst, würde ich dir eine Skript-Sprache empfehlen. TCL könnte man dafür empfehlen. Willst du allgemein mit einer Skriptsprache mal anfangen, kann ich dir Autohotkey empfehlen. Damit hatte ich meine erste Berührung mit solchen Aufgaben. Gruß Garp
Manu F. schrieb: > für Excel ist der Datensatz zu groß. Dann teile ihn doch, das ist der Mittelwertbildung doch schnuppe.
oder versuche es hiermit: http://electrostud.wikia.com/wiki/Using_WAVE_files_as_input/output_in_LTSpice
Manu F. schrieb: > Was mir aber noch wichtig ist: Es wäre gut, wenn man das Skript als > ausführbare Datei (wie z.B. .exe) abspeichern kann > Ist sowas bei Pearl oder AWK möglich? Was wären ggfs. Alternativen? Für python gibt's http://www.py2exe.org/
Hallo, ich werte häufig Messwertaufzeichnungen aus Leitsystem-Datenbanken mit Excel aus. Die Dateigröße ist da eigentlich nie ein Problem, wenn du die Datei nicht direkt mit Excel öffnest. Ich bin noch länger unterwegs und komme an keine Beispiele, aber du kannst dir alles Nötige einfach zusammensuchen. Grundsätzlich öffnest du in Excel einfach mit "GetOpenFilename" dein Log-File und liest es Zeilenweise mit "Line Input" ein solange bis du am Ende angekommen bist "Do While Not EOF" Also Addierst du zB 20x den Rückgabewert von "Line Input", Teilst das Ergebnis durch 20 und schreibst es "ActiveSheet.Range(Spalte & Zeile).Value" in deine Excel Tabelle. Anschließen "Zeile" +1 und wieder von vorn bis zum EOF. Gruß deathfun
Da sogar Excel es nicht öffnen kann, denke ich, daß das Problem tiefgreifender ist. Könnte ja auch sein, daß seine Einlesesoftware die Daten mit TAB einfach, wie eine Perlenkette aneiander hängt. Dann kann er kaum mit einer anderen fertigen Software wie z.B. Excel darauf zugreifen. Da ist dann Handarbeit angesagt, denn so einen Megastring wird wohl kaum eine Programmiersprache bereitstellen : Entweder byteweise einlesen und die gefundenen TABS mittels Variable hochzählen lassen. Ist die Variable gerade (2,4,6 ....), sind 2 Felder (Zeit, Spannungswert) eingelesen, das einem Datensatz entspricht. Die zweite Möglichkeit besteht darin, die Datei in einem Rutsch in einen Speicherbereich zu lesen. Dort kann man dann auch nach den TABs suchen und entsprechend reagieren. Da wäre ein kleiner Ausschnitt der Datei schon hilfreich. Sollten die Felder z.B. gleich lang sein, kann man auch noch andere Strategien in Betracht ziehen.
Hallo Heinz, wo soll den genau das Problem bestehen? Manu beschrieb doch das die Datei bereits über eine "Struktur" verfügt: Manu F. schrieb: > bestehend aus zwei TAB-getrennten Spalten (Zeit und Spannungswert) Und selbst wenn sie dies nicht würde, so muss es eine, wie auch immer geartete, Struktur vorhanden sein (sonst ist die Aufwertung Sinnlos). Hier ist es nun egal ob es ein Trennzeichen ist, oder eine feste Länge der Werte (etwa immer 10 Stellen). Er schrieb sogar dass es TAB getrennt ist und lediglich ein Messwert pro Zeile geschrieben wird. Er kann nun die Eingelesene Zeile "Line Input" einfach nach diesem Trennzeichen durchsuchen "Split" und den ersten Teil der Rückgabe in Spalte A, den Zweiten Teil in Spalte B schreiben. ActiveSheet.Range(Spalte & Zeile).Value = buffer(0) ActiveSheet.Range(Spalte & Zeile).Offset(0, 1).Value = buffer(1) (Im 'buffer' Array liegen die Rückgaben von Split. Eventuell ist hier noch ein "CDbl" nötig wenn Excel die Werte nicht immer als Zahl erkennen möchte.) Gruß deathfun
Heinz Brill schrieb: > Da sogar Excel es nicht öffnen kann, denke ich, > daß das Problem tiefgreifender ist. Nicht unbedingt, Excel hat einfach ein Limit bei der Zeilen und Spaltenzahl, die es verarbeiten kann, wenn man eine Datei "normal" öffnet. Bei Excel 2007 sind es wohl "1,048,576 rows by 16,384 columns"
@ Heinz, entschuldige, fast vergessen: Es muss kein tiefgreifender Problem sein, dass ist völlig normal bei Messwertdateien (zumindest sehr häufig). Letzten Freitag habe ich noch eine Messwertdatei ausgewertet - CSV Datei 67MB groß - und nicht einmal diese konnte Excel direkt öffnen. Alte Excel Versionen, meine bis 2003,schaffen zB nur 65.536 Zeilen - glaube das es ab 2007 nun etwas über eine Million sind. Die 67MB Datei als Beispiel hatte auch schon etwa 2,5 Millionen solcher Zeilen: 26.04.2014 23:00:57;983,787231445313 26.04.2014 23:00:58;983,274658203125 Die Zeilenbegrenzung ist natürlich nur ein Grund wieso Excel den Dienst verweigert (eigentlich ist Excel, wenn man es wirklich vordern möchte, eine Diva). Gruß deathfun
Excel ist eigentlich gemacht für die Verarbeitung und Visualisierung von Geschäftsdaten, wo einfach keine so großen Datenmengen vorkommen. Selbst wenn es die 150-MB-Datei einlesen könnte, wäre die Verarbeitung vermutlich unpraktikabel langsam. Da der TE aber wohl sowieso ein Tool sucht, das nur gestartet werden muss und dann die Kürzung der Datei ohne weiteres Zutun erledigt, ist das bereits vorgeschlagene Awk sicher eine gute Lösung, die auch große Datenmengen recht fix durchnudelt. Das hier gezeigte Skript tut mit ein paar kleinen Modifikationen das Gewünschte: http://stackoverflow.com/questions/8551349/how-to-sum-up-every-10-lines-and-calculate-average-using-awk Wenn es noch schneller sein muss, kann man natürlich auch ein kleines C[++]-Programm dafür schreiben.
Manu F. schrieb: > Gibt es eine Möglichkeit (Software oder Skript), dieses Problem zu > lösen? GNU R? http://www.r-project.org/
Z.B. in Perl das hier:
1 | my $cnt = 0; |
2 | my $calc = 0; |
3 | while(<>){ |
4 | chomp; |
5 | my ($time, $value) = split/\t/; |
6 | $cnt++; |
7 | $calc += $value; |
8 | if($cnt == 20){ |
9 | $calc = $calc / 20; |
10 | print "$calc\n"; |
11 | $cnt = 0; |
12 | } |
13 | } |
Aufruf in Shell Deiner Wahl: perl scriptname Inputfile >outputfile
Na, dann ist ja alles gut. Das Problem, das bei Excel auftaucht, wird auch bei anderen GUI-basierenden Programmen auftauchen. Das Syslistview32 kann halt nicht unendlich viele Zeilen anzeigen. Das ist dann eher MS Windows-bedingt. Da er aber nicht unbedingt eine Anzeige (Grid) braucht, ist so eine Konvertierung mit Datei öfnnen, einlesen usw. schnell erledigt.
Heinz Brill schrieb: > Das Syslistview32 kann halt nicht unendlich viele > Zeilen anzeigen. Das ist dann eher MS Windows-bedingt. es kann auch im VirtualMode, da dürfte erst bei INT schluss ein.
Yalu X. schrieb: > Excel ist eigentlich gemacht für die Verarbeitung und Visualisierung von > Geschäftsdaten, wo einfach keine so großen Datenmengen vorkommen. Selbst > wenn es die 150-MB-Datei einlesen könnte, wäre die Verarbeitung > vermutlich unpraktikabel langsam. Das war mal so bzw. ist in einigen Excel-Varianten wieder so... Power Pivot gab's bei der 2010er Version noch als kostenloses Add-In, bei der 2013er sind Teile integriert bzw. nur noch in der Professional Plus... http://msdn.microsoft.com/de-de/library/ee210644.aspx
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.