phiamabi
Goto Top

Bestimmte Daten aus einer Textdatei in Excel importieren

Ich habe von einem Kollegen viele Textdateien mit automatisch aufgenommen Messwerten erhalten und soll nun ganz bestimmte Werte für ihn in eine Excel-Datei übertragen.

Vorweg,
die Messdaten sehen wie folgt aus:
4294A REV1.04
"DATE: Apr  2 2012"  


"MEASURE PARAMETER: Ls - Q"  
"ADAPTER: 4TP 1M"  
"SWEEP TYPE: LIN FREQ"  
"NUMBER of POINTS: 201"  
"POINT DELAY TIME:  0 Sec"  
"SWEEP DELAY TIME:  0 Sec"  
"OSC LEVEL:  500 mVolt"  
"DC BIAS: OFF"  
"BW: 1"  
"SWEEP AVERAGING: OFF"  
"POINT AVERAGING: OFF"  


"TRACE: A"  
"FORMAT: LINEAR"  

"Frequency"	"Data Trace Real"	"Data Trace Imag"  
1.00000000000e+04	8.121696e-03	0.000000e+00
1.49500000000e+04	8.122306e-03	0.000000e+00
[snip]
9.95050000000e+05	-1.021725e-03	0.000000e+00
1.00000000000e+06	-1.010053e-03	0.000000e+00


"TRACE: B"  
"FORMAT: LINEAR"  

"Frequency"	"Data Trace Real"	"Data Trace Imag"  
1.00000000000e+04	9.817833e+00	0.000000e+00
1.49500000000e+04	9.107464e+00	0.000000e+00
[snip]
9.95050000000e+05	8.461501e+01	0.000000e+00
1.00000000000e+06	7.351902e+01	0.000000e+00


Die einzelnen Daten sind durch ein Tabulator getrennt.
Ich soll jetzt die Punkte durch Komma ersetzen (das wäre mit einem Texteditor mit suchen und ersetzen ja gar kein Problem.)
und Ich soll das jetzt wie Folgt in Excel übertragen.

L10kHz | L125kHz | Q10kHz | Q125kHz |
zweiter Wert aus Zeile 22 | zweiter Wert aus Zeile 45 | zweiter Wert aus Zeile 229 | zweiter Wert aus Zeile 252 | (aus Datei 1)
zweiter Wert aus Zeile 22 | zweiter Wert aus Zeile 45 | zweiter Wert aus Zeile 229 | zweiter Wert aus Zeile 252 | (aus Datei 2)
zweiter Wert aus Zeile 22 | zweiter Wert aus Zeile 45 | zweiter Wert aus Zeile 229 | zweiter Wert aus Zeile 252 | (aus Datei 99)
Also aus der Spalte "Data Trace Real"...

Die |-Striche sind immer ein neues Excel Feld.

Und das ganze mit ca. 100 Dateien. Wenn ich das von Hand mache bin ich da ja ewig beschäftigt. Deshalb hat mir ein Kollege aus der IT geraten hier nachzufragen... Ach ja die Dateinamen sind einigermaßen logisch aufgebaut. Es kommt immer S + fortlaufende Zahl + NH.txt
Beispiel: S00NH.TXT dann S01NH.TXT, ... , S99NH.TXT

Wäre echt super wenn jemand ein Programm kennt mit dem man so was automatisch machen kann.

Grüße
Maria

Content-Key: 183190

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: bastla
bastla Apr 06, 2012 at 09:48:54 (UTC)
Goto Top
Hallo phiamabi und willkommen im Forum!

Auf die Schnelle könntest Du folgendes VBScript (auch in Excel als VBA möglich) verwenden, um die entsprechenden Daten in einer CSV-Datei (die sich dann in Excel importieren lässt) zu sammeln:
Quelle = "D:\Messdaten" 'Ordner, der nur die S??NH.TXT-Dateien enthält  
Ziel = "D:\Messdaten.csv"  
Zeilen = Array(22,45,229,252) 'Zeilennummern in den Quelldateien  
Feld = 2 'FeldNummer in den Quelldaten  
Delim = ";" 'Trennzeichen in der Zieldatei  

Set fso = CreateObject("Scripting.FileSystemObject")  

For Each File In fso.GetFolder(Quelle).Files
    DatenEin = Split(File.OpenAsTextStream.ReadAll, vbCrLf)
    DatenSatz = fso.GetBaseName(File.Name)
    For Each Zeile In Zeilen
        DatenSatz = DatenSatz & Delim & Split(DatenEin(Zeile - 1), vbTab)(Feld - 1)
    Next
    DatenAus = DatenAus & vbCrLf & DatenSatz
Next
fso.CreateTextFile(Ziel).Write Replace(Mid(DatenAus, 3), ".", ",") 'Punkt durch Komma ersetzen und in Datei schreiben  
Grüße
bastla

[Edit] Dateiname wird jetzt als Feld 1 in die CSV-Datei geschrieben [/Edit]
Mitglied: 106009
106009 Apr 06, 2012 at 10:28:45 (UTC)
Goto Top
Hallo und willkommen im Forum.

Da hätte ich als Alternative zu bastlas Vorschlag eine Batchlösung anzubieten, das soll keine Wertung sein!

@echo off
Set ExcelLine=
Set "OutputFile=output.csv"  
Set "Trenner=;"  

del %Outputfile% 2>nul

Set "Line1=22"  
Set "Line2=45"  
Set "Line3=229"  
Set "Line4=252"  

for /f %%a in ('dir /b S??NH.TXT') do set /a Count=0 & for /F "tokens=2" %%b in (%%a) do call :process %%a %%b  
goto :eof


:Process
set /a count+=1
for %%x in (%line1% %line2% %line3% %line4%) do if %%x EQU %count% call :put %1 %2
goto :eof

:put
Set "Filename=%1"  
Set wert=%2
set "wert=%wert:.=,%"  
if [%count%]==[%Line1%] (set "ExcelLine=%1%trenner%%wert%") else (set "ExcelLine=%ExcelLine%%trenner%%wert%")  
if [%count%]==[%Line4%] @echo %ExcelLine% >> %OutputFile%
goto :eof
 

Gruß
Member: bastla
bastla Apr 06, 2012 at 11:23:55 (UTC)
Goto Top
@106009

Als Alternative zum "selber zählen" böte sich ein "findstr /n" an - schematisch etwa (da nur 4 Zeilen betroffen gleich ohne zusätzliche Schleife):
for /f %%a in ('dir /b S??NH.TXT') do call :process "%%a"  
...
:process
set "ExcelLine="  
for /f "tokens=1* delims=:" %%b in ('findstr /n "^" %1^|findstr /b "22: 45: 229: 252:) do call :put "%%c"  
...
Grüße
bastla
Mitglied: 106009
106009 Apr 06, 2012 at 11:36:56 (UTC)
Goto Top
@bastla

danke für den Tipp, ich muss mich wohl etwas mehr mit findstr beschäftigen. face-wink

Hast du keinen Tipp, wie man das Brett vor dem Kopf bzw. die Knöpfe vor den Augen dauerhaft entfernen kann? Fast eine Stunde habe ich zu obigen Zeilen nach einem Fehler gesucht und immer wieder einen Buchstabendreher überlesen. Und dann noch an der falschen Stelle @echos eingefügt, um dem auf die Spur zu kommen *grrrr*

Gruß
Member: bastla
bastla Apr 06, 2012 at 14:44:01 (UTC)
Goto Top
Hallo ollidolli!
Hast du keinen Tipp, wie man das Brett vor dem Kopf bzw. die Knöpfe vor den Augen dauerhaft entfernen kann?
Da hilft nur üben, üben, üben - und auch dann schafft man's noch oft genug, die seltsamsten Fehler einzubauen und konsequent drinnen zu lassen ... face-wink

Grüße
bastla
Member: phiamabi
phiamabi Apr 06, 2012 at 15:20:28 (UTC)
Goto Top
Vielen Dank für euere Antworten.
Leider kommt bei mir immer eine Meldung - Datei nicht gefunden.

@bastla
Mit dem Schnipsel kann ich leider gar nichts anfangen.
Könntest du mir das einbauen?
Member: phiamabi
phiamabi Apr 06, 2012 at 15:23:38 (UTC)
Goto Top
In welcher Reihenfolge werden denn die Dateien dann eingelesen?
Es sollte so sein dass die Werte aus der 00 Datei ganz oben stehen und die 99 ganz unten.
Auf keinen Fall darf etwas vertauscht werden...

Schöne Ostern face-wink
Member: bastla
bastla Apr 06, 2012 at 15:27:17 (UTC)
Goto Top
Hallo phiamabi!
Könntest du mir das einbauen?
Was soll ich wo einbauen?

Du musst doch nur:
  • alle Textdateien in einen Ordner legen
  • den Pfad zu diesem Ordner in Zeile 1 anstelle von "D:\Messdaten" eintragen
  • in Zeile 2 einen Dateinamen (inkl Pfad) für die zu erstellende CSV-Datei angeben
  • das Script (mit dem Dateityp .vbs) speichern
  • das gespeicherte Script doppelklicken
  • die entstandene CSV-Datei doppelklicken (sollte dann mit Excel geöffnet werden) oder selbst von Excel aus öffnen

Grüße
bastla
Member: bastla
bastla Apr 06, 2012 at 15:30:13 (UTC)
Goto Top
Hallo phiamabi!
Auf keinen Fall darf etwas vertauscht werden...
Ich ergänze oben das Script so, dass in die CSV-Datei noch der Dateiname geschrieben wird - dann kannst Du in Excel danach sortieren ...

Grüße
bastla
Member: bastla
bastla Apr 06, 2012 at 15:39:21 (UTC)
Goto Top
... bzw als weitere Alternative (setzt aber voraus, dass es tatsächlich alle Dateien von "00" bis "99" gibt):
Quelle = "D:\Messdaten" 'Ordner, der die S??NH.TXT-Dateien enthält  
Ziel = "D:\Messdaten.csv"  
Zeilen = Array(22,45,229,252) 'Zeilennummern in den Quelldateien  
Feld = 2 'FeldNummer in den Quelldaten  
Delim = ";" 'Trennzeichen in der Zieldatei  

Set fso = CreateObject("Scripting.FileSystemObject")  

DatenAus = "Dateiname" & Delim & "L10kHz" & Delim & "L125kHz" & "Q10kHz" & "Q125kHz" 'Kopfzeile  
If Right(Quelle, 1) <> "\" Then Quelle = Quelle & "\"  

For i = 100 To 199
    FileName = "S" & Right(i, 2) & "NH" 'Dateinamen mit laufender Nr erstellen  
    DatenSatz = FileName
    DatenEin = Split(fso.OpenTextFile(Quelle & FileName & ".TXT").ReadAll, vbCrLf)  
    For Each Zeile In Zeilen
        DatenSatz = DatenSatz & Delim & Split(DatenEin(Zeile - 1), vbTab)(Feld - 1)
    Next
    DatenAus = DatenAus & vbCrLf & DatenSatz
Next
fso.CreateTextFile(Ziel).Write Replace(DatenAus, ".", ",") 'Punkt durch Komma ersetzen und in Datei schreiben  
Auch hier werden zusätzlich die Dateinamen (ohne Typ) in die CSV-Datei geschrieben. Außerdem wird jetzt auch die Kopfzeile erzeugt.

Grüße
bastla
Member: phiamabi
phiamabi Apr 06, 2012 at 18:42:52 (UTC)
Goto Top
Vielen Dank, aber hast du das getestet?
Ich bekomme leider eine Fehlermeldung mit:

Skript: C:\Users\Maria\Desktop\test\test.vbs
Zeile: 15
Zeichen: 5
Fehler: Die Datei wurde nicht gefunden.
Code: 800A0035
Quelle: Laufzeitfehler in Microsoft VBScript
Member: bastla
bastla Apr 06, 2012 at 22:14:37 (UTC)
Goto Top
Hallo phiamabi!

Wie soll ich denn testen, ob die Dateien bei Dir tatsächlich in dem Pfad liegen, den Du (hoffentlich inzwischen) in Zeile 1 eingetragen hast, und ob sie tatsächlich nach dem Muster "S00NH.TXT" benannt (und bei Verwendung der zweiten Variante vollzählig) sind?

Grüße
bastla
Member: phiamabi
phiamabi Apr 10, 2012 at 05:51:01 (UTC)
Goto Top
Jetzt funktioniert es. Keine Ahnung warum.
Im Geschäft habe ich WindowsXP zuhause beim testen Windows7.

Naja egal. Arbeit erledigt - der Ing. wird sich freuen face-smile

Vielen Dank! face-kiss