caracol
Goto Top

Matrix in Spalte umwandeln

Hallo,

mein Problem besteht darin, dass ich eine *.spe Datei mit Messdaten auswerten soll. Nun
ist es so, dass ich von Programmierung leider absolut keine Ahnung habe, und das file,
wenn ich es mir im Editor, Excel oder Origin anschaue anstatt einer Spalte mit den Mess-
werten eine Matrix mit jewils 10 Messwerten in einer Reihe ist. Da es sich um viele Messwerte
(512) und sehr sehr viele Messungen (2000) handelt, würde ich nun gerne automatisch
aus der Matrix eine Spalte machen können. Nun kann ich mich nur noch wage daran
erinnern, dass man das wohl mit einer batch machen kann. Das file sieht im Editor
folgendermaßen aus:

$SPEC_ID:

$DATE_MEA:
05-16-191077 05:49:3
$MEAS_TIM:
399 673
$DATA:
0 511
252 280 400 167 262 288 274 339 497 492
425 247 580 1407 495 127 1322 1313 751 2053
8622 39998 39422 38345 36524 49740 93806 2441865 15734319 9529916
...
...
...
21 3 3 2 3 1 3 2 1 1
0 5

Dabei steht in der ersten Zeile unter $DATA, "0 511" für die 512 Kanäle, danach folgen die
512 Messwerte. Wie gesagt, ich habe absolut keine Ahnung von Programmierung, aber im
Prinzip sollte es doch eine eher einfache Sache sein, daraus ein file zu erstellen, das die 512
Messwerte in einer Spalte hat, so dass es sich dann später mit Excel und Origin auswerten
lässt. Falls mir irgendjemand sagen kann, wie ich das hin bekomme, wäre ich mehr als dankbar,
mir graut jetzt schon davor, das tatsächlich per Hand machen zu müssen. Danke schon mal und
Grüße,

Caracol

Content-Key: 68741

Url: https://administrator.de/contentid/68741

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: Biber
Biber 15.09.2007 um 21:54:06 Uhr
Goto Top
Moin caracol,

willkommen im Forum.
Nachfrage:
  • Messwerte stehen immer je max. 10 (oder weniger) in einer Zeile?
  • wie soll die Datei heißen?
  • Spaltenüberschrift?
  • folgen nach den Messwerten auch noch Zeilen mit Daten (Ende-Logeintrag)?

Grüße
Biber
Mitglied: caracol
caracol 15.09.2007 um 22:04:44 Uhr
Goto Top
Hi,

es stehen immer genau 10 Werte in einer Zeile, außer in
der letzten Zeile da Stehen nur 2. Sieht also genau so aus
wie oben (nur natürlich 52 Zeilen). Wie die datei heißt
ist mir egal. Spaltenüberschrift brauche ich auch keine. Hinter
den Daten kommt nichts mehr. Es sieht wirklich alles so aus
wie oben, hab einfach aus dem Editor rauskopiert und dann
die zwischen Zeilen durch ... ersetzt. Im Prinzip bräuchte ich
nur ein file, in dem die 512 Werte untereinander stehen, den
Rest kriege ich dann selber hin.

Danke für die schnelle Antwort!

Grüße, Caracol
Mitglied: bastla
bastla 15.09.2007 um 22:23:39 Uhr
Goto Top
Hallo caracol!

Willkommen auch von mir.

Eigentlich könnte der folgende Oneliner (direkt an der Befehlszeile eingegeben) schon ausreichen:
for /f "skip=8 delims=" %i in (D:\Messungen.txt) do for %w in (%i) do (echo %w)>>D:\MesswerteEinzel.txt  
Zur Verwendung in einer Batchdatei müsstest Du alle "%"-Zeichen verdoppeln.

Grüße
bastla
Mitglied: caracol
caracol 15.09.2007 um 22:28:08 Uhr
Goto Top
Hi,

also wie gesagt, hab übergaupt keine Ahnung vom Programmieren,
das einzige was ich mal konnte war Qbasic. Also wie in den cmd prompt
komme weiß ich ja gerade noch. Jetzt geb ich da diesen oneliner von
Biber ein, gut. Aber wo wird da der Pfad der Datei eingegeben, wo wird sie hin
gespeichert? Ich weiß meine Fragen sind dumm, aber normalerweise
hab ich nur mit der analogen Welt zu tun.

Grüße,

Caracol
Mitglied: Biber
Biber 15.09.2007 um 22:30:18 Uhr
Goto Top
Moin Caracol,

ich würde ja den folgenden Oneliner vom CMD-Prompt aus eingeben:
for /f "delims=:" %%i in ('findstr /n /i "$data" messwerte.txt') do @For /f %%j in ('Set /a 1+%%i') do @for /f "delims=" %%k in ('more +%%j messwerte.txt') do @For %%l in (%%k) do @echo %%l  

Aber wenn Du lieber einen Batch möchtest:
::----Snipp Messwerte2Spalte.bat
@for /f "delims=:" %%i in ('findstr /n /i "$data" messwerte.txt') do @(  
   For /f %%j in ('Set /a 1+%%i') do @(  
      for /f "delims=" %%k in ('more +%%j messwerte.txt') do @(  
         For %%l in (%%k) do @echo %%l
))))

Annahme: Deine Messwert-Datei heißt "messwerte.txt" (das steht so fest an zwei Stellen drin in dem Schnipsel).
Da ich nicht sicher bin, ob die Messdaten immer in Zeile 8 anfangen,
ermittle ich die erste Messdatenzeile als "eine Zeile nach Zeile mit String "$DATA" .

Besser als den Dateinamen fest verdrahtet im Source: diesen Namen als Parameter übergeben:
::----Snipp Messwerte2Spalte_mitParameter.bat
@for /f "delims=:" %%i in ('findstr /n /i "$data" "%~1"') do @For /f %%j in ('Set /a 1+%%i') do @(  
      for /f "delims=" %%k in ('more +%%j "~1"') do @For %%l in (%%k) do @echo %%l  
))

...und dann aufrufen mit "Meswerte2Spalte_mitParameter d:\pfad\NameDerMesswertdatei.xyz >NeueEin-Spaltendatei.abc"

Grüße
Biber
Mitglied: caracol
caracol 15.09.2007 um 22:54:12 Uhr
Goto Top
Hi,

also die Version von bastla funktioniert jetzt. Hab mich wohl vertippt, und musste erst mal rausfinden wie Copy und Paste im cmd prompt funktioniert. Tausend Tausend Dank!

Grüße, Caracol
Mitglied: bastla
bastla 15.09.2007 um 23:20:56 Uhr
Goto Top
Hallo caracol!

Wie ich Deinen weiteren Ausführungen oben entnehme, befinden sich die Werte nicht (wie von mir angenommen) in einer einzigen Datei, sondern sind auf 2000 Einzeldateien verteilt - daher besser eine Batchlösung.

Du könntest den folgenden Code verwenden, um alle .txt-Dateien eines gesamten Ordners (Quelle) zu bearbeiten und die Ergebnisse in einen anderen Ordner (Ziel) zu schreiben:
@echo off & setlocal
set "Quelle=D:\OrdnerMitMesswertdateien"  
set "Ziel=D:\OrdnerMitUmgewandeltenMesswertdateien"  
if not exist "%Ziel%" md "%Ziel%"  
for %%d in ("%Quelle%\*.txt") do for /f "usebackq skip=8 delims=" %%i in ("%%d") do for %%w in (%%i) do (echo %%w)>>"%Ziel%\%%~nxd"  

Speichere den Code mit einem beliebigen Editor als "InEinzelspalte.cmd" (Name egal, Typ ".cmd" oder ".bat").

Achtung: Wenn Du den Standard-Windows-Editor verwendest, beim Speichern zunächst den Dateityp auf "Alle Dateien" setzen und den Namen unter Anführungszeichen eingeben, da sonst noch zusätzlich ".txt" angefügt wird.

Danach den Batch per Doppelklick auf die ".cmd"-Datei ausführen.

Grüße
bastla
Mitglied: caracol
caracol 15.09.2007 um 23:35:30 Uhr
Goto Top
Hi,

das ist natürlich noch besser. Hättest Du vielleicht auch noch
einen Vorschlag, wie man dannn gleich alle 2000 Spalten
nebeneinander in eine Datei schreiben könnte?

Auf jeden Fall tausend Dank! Ohne Dich (Euch) hätte ich das
bis zu meiner Präsentation am Mo nicht mehr gerschafft!

Grüße,

Caracol
Mitglied: bastla
bastla 16.09.2007 um 00:27:24 Uhr
Goto Top
Hallo caracol!

Sofern Du ein Excel 2007 (und damit genügend Spalten auf einem Tabellenblatt) hast, könntest Du das folgende VBA-Programm verwenden, um die im vorigen Schritt erstellten einspaltigen Textdateien in Excel einzulesen:
Sub Einlesen()
Const Quelle = "D:\OrdnerMitUmgewandeltenMesswertdateien"  
Dim wbSammel As Workbook, fso As Object, Datei As Object
Dim Sp As Integer
Set wbSammel = ThisWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")  
Sp = 1
For Each Datei In fso.GetFolder(Quelle).Files
    If fso.GetExtensionName(Datei.Path) = "txt" Then  
        Workbooks.OpenText Datei.Path
        Columns("A:A").Select  
        Selection.Copy
        wbSammel.Activate
        Cells(1, Sp).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Workbooks(Datei.Name).Close
        Sp = Sp + 1
    End If
Next
wbSammel.Activate
Range("A1").Activate  
wbSammel.Save
End Sub
Vorgangsweise:
  • Neue Excel-Arbeitsmappe erstellen und unter beliebigem Namen speichern,
  • per Rechtsklick auf das Blattregister für "Tabelle1" und Klick auf "Code anzeigen" in den VBA-Editor wechseln,
  • dort das obige Programm in das große Codefenster einfügen,
  • Pfad für die Quelldateien anpassen,
  • Cursor in einer beliebigen Zeile zwischen "Sub Einlesen()" und "End Sub" platzieren und
  • Programm mit F5 oder dem grünen "Play"-Symbol in der Symbolleiste starten.

Sollte kein Excel 2007 zur Verfügung stehen,
  • nur jeweils maximal 256 Textdateien im Quell-Ordner platzieren,
  • das Programm wie oben beschrieben starten und
  • nach dem Einlesen dieser Dateien das nächste Tabellenblatt im Blattregister der Excel-Arbeitsmappe markieren (es wird immer in das ausgewählte Blatt geschrieben).
  • Danach mit dem Explorer die nächsten 256 Dateien in den Quell-Ordner befördern und
  • das Programm wieder starten,
  • and so on ...

Zur Sicherheit wird nach jedem Programmdurchlauf die Excel-Arbeitsmappe automatisch gespeichert.

Grüße
bastla
Mitglied: bastla
bastla 16.09.2007 um 01:21:36 Uhr
Goto Top
Update: Name der Textdatei (ohne Extension) wird in erste Zeile geschrieben
Sub Einlesen()
Const Quelle = "D:\OrdnerMitUmgewandeltenMesswertdateien"  
Dim wbSammel As Workbook, wsTabelle As Worksheet, fso As Object, Datei As Object
Dim Sp As Integer
Set wbSammel = ThisWorkbook
Set wsTabelle = ActiveSheet
Set fso = CreateObject("Scripting.FileSystemObject")  
Sp = 1
For Each Datei In fso.GetFolder(Quelle).Files
    If LCase(fso.GetExtensionName(Datei.Path)) = "txt" Then  
        Workbooks.OpenText Datei.Path
        Sheets(1).Range("A1").CurrentRegion.Copy  
        wbSammel.Activate
        wsTabelle.Cells(1, Sp).Value = fso.GetBaseName(Datei.Name)
        wsTabelle.Cells(2, Sp).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Workbooks(Datei.Name).Close
        Sp = Sp + 1
    End If
Next
wbSammel.Activate
wsTabelle.Range("A1").Activate  
wbSammel.Save
End Sub

Grüße
bastla

[Edit] Sollte jetzt auch bei mehreren unterschiedlichen Ziel-Tabellenblättern (für Pre-Excel 2007) funktionieren. [/Edit]
Mitglied: caracol
caracol 16.09.2007 um 01:39:49 Uhr
Goto Top
Hallo bastla,

PEREFEKT!!! Hab meine Auswertung jetzt im Prinzip fertig, muss nur noch meine Lorentz-Fits etwas anpassen... . Danke nochmal, dass hat mich echt gerettet.

Grüße,

Caracol
Mitglied: bastla
bastla 16.09.2007 um 01:43:01 Uhr
Goto Top
Hallo caracol!

Alles Gute für Montag! face-smile

Grüße
bastla