online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon DasWasserWiesel vom 29.10.2020, 15:13 Options

Lösung

.res nach .txt konvertieren

Hallo,

ich will eine .res Datei in eine ganz einfache .txt Textdatei konvertieren - die Feldtrennzeichen sollen keine ; sein.

Vielleicht doch nicht so einfach. Brauch das für Access.

Access soll die Daten automatisch aus der txt Datei in einen Table einlesen. Das geht mit txt auch aber .res erkennt es nicht (obwohl eigendlich das gleiche).

Hab ein Makro das das mit excel macht und als Trennzeichen nen Strich verwendet. Aber genau das brauch ich für .res zu .txt mit ; (Semikolon)

Hab leider keine Ahnung was ich umändern muss.

Hiiiiiiiiillllllllllfffffffffeeeeeeeeee !!!


Sub Makro1()
Dim MerkName, MerkFormat, Tmp As String, Res As String, I As Long, Ch As String * 1
Const InpFile = "TTT.TMP", OutpFile = "TTT.TXT", TempDir = "C:\TEMP"
ChDir TempDir
MerkFormat = ActiveWorkbook.FileFormat
MerkName = ActiveWorkbook.FullName
ActiveWorkbook.SaveAs FileName:=InpFile, FileFormat:=xlTextWindows
Open InpFile For Input As #1
Open OutpFile For Output As #2
Do While Not EOF(1)
Line Input #1, Tmp
Res = ""
For I = 1 To Len(Tmp)
Ch = Mid$(Tmp, I, 1)
If Asc(Ch) = 9 Then
Res = Res & "|"
Else
Res = Res & Ch
End If
Next I
Print #2, Res
Loop
Close #1
Close #2
Kill MerkName
ActiveWorkbook.SaveAs FileName:=MerkName, FileFormat:=MerkFormat
Kill InpFile
End Sub


Antwort schreiben

Antwort 21 von DasWasserWiesel vom 04.11.2020, 16:56 Options

Also in meiner .res File ist die Kopfzeile nicht drin. Das ist eine Ergebnis-File einer Messmaschine.

Ich muss die Namen irgendwie anders als Spaltenname in den Access Table reinbekommen.
Darf sie aber nicht in die .res File als erste Zeile schreiben.

Bei mir erstellt alles Zeilen aber packt alles in eine Spalte (macht einfach nicht mehrere auf).

Kann ich Dir irgendwie Screenshots oder die Datenbank mal schicken ?

Antwort 22 von lorf55 vom 04.11.2020, 18:30 Options

Schicks an lorf55 bei googlemail pünktchen com wenn du magst

Antwort 23 von lorf55 vom 04.11.2020, 20:55 Options

Sorry, manchmal ist der Bürger wie vernagelt. Es ist ganz einfach. Du siehst das auch. Nochmal genau hinsehen, denn siehst du es wirklich:

HDR=NO

Das ergibt denn diese Tabelle mit Namen GFM_Database_Import:
F1	F2	F3	F4	F5	F6	F7	F8	F9	F10	F11	F12	F13	F14	F15
Test	0F021451752200451175	0F021451752200451175		2	13.06.2005	10:47:11	BE	250547	2118	2214	2161	2283	2170	2165
Test	a	a		1	13.06.2005	10:53:01	a	250553	2109	2212	2155	2241	2171	2181


Da du schon eine Tabellendefinition oben angeben hast, habe ich noch eine AnfügeSQL für die GFM_DataBase und einen DROP für die Importdatei hinzugefügt, so dass das Makro jetzt so aussieht:
Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "M:\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "511 Tape Binder Reference Sheet"

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh
'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute _
"INSERT INTO GFM_DataBase ( GFM, [print step], [lot_#], production_No, [print line], [date], [time], operator," + _
            "[measure 1], [measure 2], [measure 3], [measure 4], [measure 5], [measure 6], [measure 7] )" + _
"SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15]" + _
"FROM GFM_DataBase_IMPORT;", dbFailOnError

'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"
End Function


Die Daten werden also in eine temporäre Datei importiert und denn in die Datenbank eingefügt und am Ende die Importdatei gelöscht.

Also bei mir "funzt es wie Sau" und dauert auf meinem PIII900 gefühlte 2Sek für die 2200 Zeilen.

Gruß
lorf

Antwort 24 von DasWasserWiesel vom 05.11.2020, 13:58 Options

Super, Vielen Dank.

Hab noch ein kleines Problemchen.

Es kommt immer --> too few parameters as expected

hab aber 28 Spaltennamen und F1 bis F28
woran kann das liegen ?




Private Sub Command2_Click()

Convert_res_to_txt

End Sub


Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "M:\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "511 Tape Binder Reference Sheet"

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh

'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute _
"INSERT INTO GFM_DataBase ( GFM, [print step], [lot_#], production_No, [print line], [date], [time], operator," + _
"[measure 1], [measure 2], [measure 3], [measure 4], [measure 5], [measure 6], [measure 7], [measure 8], [measure 9], [measure 10], [measure 11], [measure 12], [measure 13], [measure 14], [measure 15], [measure 16], [measure 17], [measure 18], [measure 19], [measure 20] )" + _
"SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15], [F16], [F17], [F18], [F19], [F20], [F21], [F22], [F23], [F24], [F25], [F26], [F27], [F28]" + _
"FROM GFM_DataBase_IMPORT;", dbFailOnError

'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"
End Function

Antwort 25 von lorf55 vom 05.11.2020, 14:39 Options

Stimmen denn die Namen vom INSERT-Statement mit deinen GFM_Database-Spaltennamen genau überein? Also GFM, print step, lot_#, production_No, print line, date, time, operator kommen in der Tabelle in genau der Schreibweise vor?
Ich habe nämlich beim Testen aus
production # production_No und aus
lot# lot_# gemacht.

Denn hieß die Fehlermeldung sicher Too few parameters, Expected 2?
;)

Gruß
lorf

Antwort 26 von DasWasserWiesel vom 05.11.2020, 14:47 Options

Sind eigendlich die gleichen.


Die Fehlermeldung ist sogar: Too few parameters, Expected 27

Antwort 27 von DasWasserWiesel vom 05.11.2020, 16:51 Options

Hallo,

ich hab jetzt mal nen Table erstellt (Spaltennamen sind die Nummern 1 bis 28). Dann den unten abgebildete VBA Code.

Es kommt immer noch als Fehlermeldung:

Too few parameters, Expected 27

Warum geht das ding bei mir einfach nicht ???




Private Sub Command2_Click()

Convert_res_to_txt

End Sub

-----------------

Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "M:\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "511 Tape Binder Reference Sheet"

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh

'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute _
"INSERT INTO GFM_DataBase ( [1], [2], [3], [4], [5], [6], [7], [8]," + _
"[9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28] )" + _
"SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15], [F16], [F17], [F18], [F19], [F20], [F21], [F22], [F23], [F24], [F25], [F26], [F27], [F28]" + _
"FROM GFM_DataBase_IMPORT;", dbFailOnError


'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"
End Function

Antwort 28 von lorf55 vom 05.11.2020, 17:38 Options

Warum es nicht ging:
1.) INSERT heißt einfügen, d.h. die Tabelle muss die Spalten zum Einfügen vom Namen und vom Typ her enthalten.
2.) die Spaltennamen müssen zum SQL passen, und zwar ganz genau
3.) die Import-Datei sollte schon so viele Spalten beherbergen, wie im SQL abgefragt werden

sonst fragt Access eben nach.

Ich habe jetzt eine RES-Datei mit allen 20 Measure-Spalten angelegt und damit getestet und es läuft.

Ach ja und ab und an sollte man denn unter Extras - Datenbank komprimieren die MDB verdichten, damit die gelöschten Tabellen entfernt werden.

Gruß
lorf

Antwort 29 von DasWasserWiesel vom 05.11.2020, 18:00 Options

o.k

ich sehe dass deine Version gut funktioniert.

Vielen, Vielen Dank

Das Problem ist, dass ich verschiedene .res Dateien abfragen muss und die haben verschieden viele Werte (sprich ich brauch mal nur 8 Spalten mal 15 Spalten).

Geht es irgendwie dass ich den Table mit 20 Spalten habe und eben so viele Spalten gefüllt werden wie in der .res Datei vorhanden sind ?

Antwort 30 von lorf55 vom 05.11.2020, 20:25 OptionsLösung

Lösung
Zitat:
Das Problem ist, dass ich verschiedene .res Dateien abfragen muss und die haben verschieden viele Werte (sprich ich brauch mal nur 8 Spalten mal 15 Spalten).

Ja, solange die Datenbank 15 Spalten hat.

Zitat:
Geht es irgendwie dass ich den Table mit 20 Spalten habe und eben so viele Spalten gefüllt werden wie in der .res Datei vorhanden sind ?

Dafür habe ich das Makro angepasst:
Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "M:\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "511 Tape Binder Reference Sheet"  '"511_measure1-20"

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"
'''' Import aus RES-Datei
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh

'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Minimal-SQL-Strings zum Einlesen aus der Import-Datei
Const SQL1 = "INSERT INTO GFM_DataBase ( GFM, [print_step], [lot_#], [production_#], [print_line], [date], [time], operator, " + _
            "[measure 1], [measure 2], [measure 3], [measure 4], [measure 5], [measure 6], [measure 7] "
Const SQL2 = "SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15]"
Const SQL3 = " FROM GFM_DataBase_IMPORT;"
Dim SQL As String

'''' Anzahl der eingelesenen Felder
Dim cnt As Integer, i As Integer
cnt = CurrentDb.TableDefs("GFM_DataBase_IMPORT").Fields.Count

'''' SQL-String aufbauen
SQL = SQL1
For i = 7 + 1 To 7 + cnt - 15
  SQL = SQL + ", [measure " & i & "] "
Next i
SQL = SQL + ") " + SQL2
For i = 15 + 1 To cnt
  SQL = SQL + ", [F" & Trim(Str(i)) & "] "
Next i
SQL = SQL + SQL3

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute SQL, dbFailOnError

'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"
End Function


Es geht davon aus, dass mindestens 7 Messdaten immer erfasst werden und fügt ansonsten noch soviel Felder an, wie in der Import-Datei sind.

Gruß
lorf

Antwort 31 von DasWasserWiesel vom 06.11.2020, 16:03 Options

Hi

Habe eine Spalte (print_Step) gelöscht und die Spalte "diagonal" hinzugefügt + neue .res File.

Wenn ich dies versuche (mit deinem Code), dann kommt bei mir immer

--> Too few parameters, Expected 27

Keine neue Daten in GFM_DataBase.

Entweder stimmt was mit meinem Access nicht, oder mit mir.

Danke, DasWasserWiesel




Private Sub Command2_Click()

Convert_res_to_txt

End Sub


Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "I:\Common\MOE4\MOE4.2 PSE Planar\MOE4.2 - Element\Department 284\Engineering\Creyaufmueller\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "637 Protective Layer 1" 'hat ca 18 Werte

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh

'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute _
"INSERT INTO GFM_DataBase ( GFM, [lot_#], [production_#], [print_line], [date], [time], operator, [diagonal]," + _
"[measure 1], [measure 2], [measure 3], [measure 4], [measure 5], [measure 6], [measure 7], [measure 8], [measure 9], [measure 10], [measure 11], [measure 12], [measure 13], [measure 14], [measure 15], [measure 16], [measure 17], [measure 18], [measure 19], [measure 20] )" + _
"SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15], [F16], [F17], [F18], [F19], [F20], [F21], [F22], [F23], [F24], [F25], [F26], [F27], [F28]" + _
"FROM GFM_DataBase_IMPORT;", dbFailOnError

'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"
End Function

Antwort 32 von lorf55 vom 06.11.2020, 21:55 Options

Ein paar Gedanken dazu:
    - Wo steht denn die [diagonal] in der RES drin. Die sieht genauso aus, wie die andere.
    - Was schon mal klar ist, ist dass die Datentypen durch das Streichen von [print_step] nicht mehr zu den Spalten der GFM_Database passen (date passt nicht in time usw.). Am Besten du ersetzt [print_step] durch [diagonal], also
    GFM, [diagonal], [lot_#], [production_#], [print_line], [date], [time], operator

    - Das mit "mal 8 mal 15 Spalten" ist an dieser Maschine jetzt wohl nicht mehr so wichtig?
    - Wenn du was änderst, und du weißt nicht was passiert, kannst du im Debugger schrittweise durchgehen und dir zwischendurch auch die Tabellen anzeigen lassen und vergleichen. Dazu kann man dort mit Klick auf die linke Seite einen Haltepunkt setzen, das Makro starten und ab dem Haltepunkt schrittweise mit F8 abarbeiten.


Gruß
lorf

Antwort 33 von DasWasserWiesel vom 07.11.2020, 15:19 Options

Hi lorf,

mein Problem ist dass ich nur sehr wenig vba kenntnisse hab und das hier als student schnell mal so machen soll. hab schon angemerkt, dass das nicht so einfach ist.

ich bin im debug modus meiner meinung nach auf das problem gestossen.

der table GFM_DataBase passt von den spalten her und deren datentypen.

aber der table GFM_DataBase_IMPORT schreibt alle werte in nur eine spalte. die reihen stimmen aber in der spalte stehen dann alle werte drin durch ; getrennt.

in diesem table müssten doch auch die werte schon auf mehrere spalten aufgeteilt sein, oder ?


Private Sub Command2_Click()

Convert_res_to_txt

End Sub


Function Convert_res_to_txt()
Dim Pfad As String
Pfad = "M:\Project 21 - GFM DataBase\GFM Results 102708"
Dim file As String
file = "637 Protective Layer 1"

'''' Die RES-Datei in CSV umbenennen damit Access uns versteht
Name Pfad & "\" & file & ".res" As Pfad & "\" & file & ".CSV"

'''' Import aus RES-Datei
CurrentDb.Execute _
"SELECT * INTO GFM_DataBase_IMPORT " + _
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
CurrentDb.TableDefs.Refresh

'''' Ausgangszustand wieder herstellen
Name Pfad & "\" & file & ".CSV" As Pfad & "\" & file & ".res"

'''' Minimal-SQL-Strings zum Einlesen aus der Import-Datei
Const SQL1 = "INSERT INTO GFM_DataBase ( GFM, [lot_#], [production_#], [print_line], [date], [time], operator, [diagonal], " + _
"[measure 1], [measure 2], [measure 3], [measure 4], [measure 5], [measure 6], [measure 7] "
Const SQL2 = "SELECT [F1], [F2], [F3], [F4], [F5], [F6], [F7], [F8], [F9], [F10], [F11], [F12], [F13], [F14], [F15]"
Const SQL3 = " FROM GFM_DataBase_IMPORT;"
Dim SQL As String

'''' Anzahl der eingelesenen Felder
Dim cnt As Integer, i As Integer
cnt = CurrentDb.TableDefs("GFM_DataBase_IMPORT").Fields.Count

'''' SQL-String aufbauen
SQL = SQL1
For i = 7 + 1 To 7 + cnt - 15
SQL = SQL + ", [measure " & i & "] "
Next i
SQL = SQL + ") " + SQL2
For i = 15 + 1 To cnt
SQL = SQL + ", [F" & Trim(Str(i)) & "] "
Next i
SQL = SQL + SQL3

'''' Aus der IMPORTdatei in GFM_Database einfügen
CurrentDb.Execute SQL, dbFailOnError

'''' Die IMPORTdatei löschen
CurrentDb.Execute _
"DROP TABLE GFM_DataBase_IMPORT"


End Function

Antwort 34 von lorf55 vom 07.11.2020, 19:39 Options

Also warum das alles in ein Feld importiert wird, weiß ich im Moment nicht. Probier doch mal die RES in CSV umzubenennen und denn von Hand über Datei - Externe Daten - Importieren zu importieren. Vielleicht gibt es ja irgendwas Auffälliges zu sehen, was uns weiter bringt.

Eine andere Variante wäre, ein anderes Feldtrennzeichen zu benutzen, z.B. # oder |. Denn muss in
"FROM [Text;FMT=Delimited(;);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError
bei Delimited dein Trennzeichen stehen z.B. das # so
"FROM [Text;FMT=Delimited(#);HDR=NO;DATABASE=" & Pfad & ";].[" & file & ".CSV];", dbFailOnError

Denn muss natürlich auch in der RES-Datei das Semikolon ausgetauscht werden.
Übrigens ist das Problem auch bei völlig anderer Importweise möglich(Link).

Gruß
lorf

Ähnliche Themen

Mit Excel einen txt Import aufbereiten
SteffenVV  18.07.2007 - 10 Hits - 2 Antworten

txt-Datein öffnen
schoolwork  21.08.2007 - 21 Hits - 10 Antworten

mehrere TXT-Dateinen nach Excel importieren
Krischan02  24.02.2008 - 63 Hits - 3 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 01:23:17 2026