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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 68741
Url: https://administrator.de/forum/matrix-in-spalte-umwandeln-68741.html
Ausgedruckt am: 19.05.2025 um 17:05 Uhr
12 Kommentare
Neuester Kommentar
Hallo caracol!
Willkommen auch von mir.
Eigentlich könnte der folgende Oneliner (direkt an der Befehlszeile eingegeben) schon ausreichen:
Zur Verwendung in einer Batchdatei müsstest Du alle "%"-Zeichen verdoppeln.
Grüße
bastla
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
Grüße
bastla
Moin Caracol,
ich würde ja den folgenden Oneliner vom CMD-Prompt aus eingeben:
Aber wenn Du lieber einen Batch möchtest:
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:
...und dann aufrufen mit "Meswerte2Spalte_mitParameter d:\pfad\NameDerMesswertdatei.xyz >NeueEin-Spaltendatei.abc"
Grüße
Biber
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
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:
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
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
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:
Vorgangsweise:
Sollte kein Excel 2007 zur Verfügung stehen,
Zur Sicherheit wird nach jedem Programmdurchlauf die Excel-Arbeitsmappe automatisch gespeichert.
Grüße
bastla
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
- 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
Update: Name der Textdatei (ohne Extension) wird in erste Zeile geschrieben
Grüße
bastla
[Edit] Sollte jetzt auch bei mehreren unterschiedlichen Ziel-Tabellenblättern (für Pre-Excel 2007) funktionieren. [/Edit]
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]