Forum: PC-Programmierung Datensätze kürzen


von Manu F. (maenju4)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

Sicher, daß Excel damit nicht klar kommt? Wundert mich.

AWK wäre eine elegante Lösungsmöglichkeit.

von Peter II (Gast)


Lesenswert?

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?

von Manu F. (maenju4)


Lesenswert?

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?

von tester (Gast)


Lesenswert?

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? :-)

von Oliver (Gast)


Lesenswert?

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

von vcd (Gast)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

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.

von garath (Gast)


Lesenswert?

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

von X4U (Gast)


Lesenswert?

Manu F. schrieb:
> für Excel ist der Datensatz zu groß.

Dann teile ihn doch, das ist der Mittelwertbildung doch schnuppe.

von X4U (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

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/

von deathfun (Gast)


Lesenswert?

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

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von deathfun (Gast)


Lesenswert?

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

von Justus S. (jussa)


Lesenswert?

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"

von deathfun (Gast)


Lesenswert?

@ 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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Manu F. schrieb:
> Gibt es eine Möglichkeit (Software oder Skript), dieses Problem zu
> lösen?

GNU R?

http://www.r-project.org/

von Blinky (Gast)


Lesenswert?

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

von Blinky (Gast)


Lesenswert?

Sorry, nach dem $cnt = 0; gehört natürlich auch noch ein "$calc = 0;"

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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
Noch kein Account? Hier anmelden.