Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
704to708
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
704to708
704to708
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Datei Byteweise einlesen

Datei Byteweise einlesen
08.12.2005 19:21:02
Reinhard
Hallo Wissende,
die Grundstruktur ist mir bei zeilenweisen Einlesen her bekannt aber mit den anderen Einleseoptionen tue ich mich sehr schwer.:(

Sub Einlesen()
open "c:\bild.bmp" for ? as #1
while not eof(1)
get?...
zei=zei+1
cells(zei,1)=
wend
End Sub

Und wie mache ich es wenn ich gleichzeitig mehrere Bytes einlesen will, oder gar die ganze Datei auf einen Rutsch?
Gruß
Reinhard

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei Byteweise einlesen
08.12.2005 20:17:40
Iwanowitsch
Abend,
habe ich aus einer Internetseite:
'Beschreibung
'Textdateien sind sehr beliebt, da sich hier schnell Informationen speichern und wieder abrufen lassen - so sollte man meinen. Dies trifft aber immer nur dann zu, wenn es um den gesamten Inhalt einer Textdatei geht - sprich, wenn man den gesamten Inhalt einliest, ein paar Änderungen vornimmt und dann den Inhalt einfach wieder komplett rausschreibt.
'Was aber nun, wenn man nur bestimmte Zeileninformationen der Textdatei benötigt. Man möchte also z.B. den Inhalt der dritten Zeile auslesen und diesen dann modifziert wieder abspeichern.
'Genau für solche Zwecke habe ich kurzerhand nachfolgende Routinen erstellt, die einem das Lesen und Schreiben bzgl. sequentieller Dateien wesentlich erleichtert.
'Am einfachsten ist es, wenn Sie den gesamten nachfolgenden Code in ein neues Modul packen.
'Zunächst ein paar Deklarationen zum Ermitteln des temporären Verzeichnisses und eines temporären Dateinamens. Diese Funktion wird für das Schreiben einzelner Zeilen-Inhalte benötigt.
Option Explicit
' Wird benötigt, zum Ermitteln des temporären
' Verzeichnisses und zum Erstellen temporärer Dateien
Private Declare Function GetTempFileName Lib "kernel32" _
Alias "GetTempFileNameA" (ByVal lpszPath As String, _
ByVal lpPrefixString As String, _
ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
Private Declare Function GetTempPath Lib "kernel32.dll" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
Private winTempPath As String
' Ermittelt einen temporären Dateinamen
' im temporären Verzeichnis

Private Function txt_TempFilename() As String
Dim myTempFileName As String
Dim RetVal As Long
If winTempPath = "" Then
' Temporäres Verzeichnis ermitteln
winTempPath = Space$(256)
RetVal = GetTempPath(Len(winTempPath), winTempPath)
winTempPath = Left$(winTempPath, RetVal)
End If
' Temporären Dateinamen ermitteln
myTempFileName = Space$(256)
Call GetTempFileName(winTempPath, "txt", 0&, myTempFileName)
myTempFileName = Left$(myTempFileName, _
InStr(myTempFileName, Chr$(0)) - 1)
txt_TempFilename = myTempFileName
End Function

'Inhalt einer Datei komplett in eine String-Variable einlesen
'Das Einlesen des gesamten Inhaltes einer beliebigen Datei übernimmt die Funktion txt_ReadAll. Die Funktion erwartet als Paramater den vollständigen Dateinamen der Datei. Zurückgegeben wird dann der Inhalt der Datei - als String-Variable.
' Lesen des gesamten Inhaltes einer Textdatei
' sFilename: vollständiger Dateiname
' =========================================================
Public Function txt_ReadAll(ByVal sFilename As String) _
As String
Dim F As Integer
Dim sInhalt As String
' Existiert die Datei ?
If Dir$(sFilename, vbNormal) "" Then
' Textdatei im Binärmodus öffnen und gesamten
' Inhalt in einem Rutsch auslesen
F = FreeFile
Open sFilename For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
End If
txt_ReadAll = sInhalt
End Function
'Inhalt in Textdatei speichern
'Die nachfolgende Routine speichert einen beliebigen Inhalt, angegeben durch den Paramater sLines in die Textdatei, welche durch den Paramater sFilename bestimmt wird. Sollte die Datei bereits existieren, wird diese überschrieben, d.h. der bisherige Inhalt der Datei geht vollständig verloren!
' Beliebigen Text in eine Textdatei speichern, wobei
' der bisherige Inhalt der Textdatei vollständig
' überschrieben wird
'
' sFilename: vollständiger Dateiname
' sLines : Inhalt, der gespeichert werden soll
' ===============================================
Public Sub txt_WriteAll(ByVal sFilename As String, _
ByVal sLines As String)
Dim F As Integer
' Datei zum Schreiben öffnen
' Achtung: bisheriger Inhalt wird gelöscht!
F = FreeFile
Open sFilename For Output As #F
Print #F, sLines
Close #F
End Sub
'Einzelne Zeile an eine Textdatei anfügen
'Die nachfolgende Prozedur fügt den durch sLine angegebenen Inhalt ans Ende einer Textdatei an. Die Datei wird automatisch erstellt, sollte sie noch nicht existieren.
' Einzelne Zeile an eine Textdatei anhängen
' sFilename: vollständiger Name der Datei
' sLine : Inhalt, der gespeichert werden soll
' ===============================================
Public Sub txt_AppendLine(ByVal sFilename As String, _
ByVal sLine As String)
Dim F As Integer
' Datei zum "Anhängen" von Daten öffnen
' und Textzeile ans Ende anfügen
F = FreeFile
Open sFilename For Append As #F
Print #F, sLine
Close #F
End Sub
'Auslesen des Inhaltes einer ganz bestimmten Zeile
'Um den Inhalt einer ganz bestimmten Zeile einzulesen, muss die Datei geöffnet werden und der Inhalt zeilenweise bis zur gewünschten Zeilenposition eingelesen werden. Zu beachten ist, daß es durchaus vorkommen kann, daß man z.B. den Inhalt der 5. Zeile ermitteln möchte, in der Datei selbst aber nur 3 Zeilen gespeichert sind. In diesem Fall muss dann ein Leerstring zurückgegeben werden.
' Lesen einer bestimmten Zeile einer Textdatei
' sFilename: vollständiger Dateiname
' LineToRead: Zeile, deren Inhalt zurückgegeben werden soll
' =========================================================
Public Function txt_ReadLine(ByVal sFilename As String, _
ByVal LineToRead As Long) As String
Dim F As Integer
Dim sLine As String
Dim lRow As Long
lRow = 0
' Existiert die Datei ?
If Dir$(sFilename) "" Then
' Datei zum Lesen öffnen
F = FreeFile
Open sFilename For Input As #F
' Solange einlesen, bis entweder Dateiende
' oder gewünschte Zeilennummer erreicht
While Not EOF(F) And lRow lRow = lRow + 1
Line Input #F, sLine
Wend
Close #F
End If
' Dateiende wurde frühzeitig erreicht,
' oder Datei war nicht vorhanden
If lRow sLine = ""
txt_ReadLine = sLine
End Function
'Ändern eines bestimmten Zeileninhaltes einer Datei
'Hierbei handelt es sich um die umfangreichste der in diesem Modul vorgesehenen Prozeduren und Funktionen. Zum Ändern eines bestimmten Zeileninhaltes wird folgendermassen vorgegangen:
'Es wird eine temporäre Datei erstellt, in welcher der Inhalt der Orginaltextdatei zwischengespeichert wird. Hierbei wird die Originaldatei zeilenweise ausgelesen. Stösst man nun beim Auslesen auf die zu ändernde Textzeile (angegeben durch einen Zeilennummer), so wird in diesem Fall nicht der ursprüngliche Inhalt, sondern der modifizierte Zeileninhalt in die temporäre Datei geschrieben. Alle restlichen Textzeilen werden dann wieder zeilenweise gelesen und gespeichert. Zum Abschluss muss dann die Originaldatei gelöscht werden und die temporäre Datei in die Originaldatei umbenannt werden.
' Einzelne Zeile in eine Textdatei speichern
' sFilename: vollständiger Name der Datei
' LinePos : Zeilenummer in der Textdatei
' sLine : Inhalt, der gespeichert werden soll
' ===============================================
Public Sub txt_WriteLine(ByVal sFilename As String, _
ByVal LinePos As Long, ByVal sLine As String)
Dim F As Integer
Dim N As Integer
Dim i As Long
Dim lRow As Long
Dim Zeile As String
Dim myTempFile As String
If Dir$(sFilename, vbNormal) = "" Then
' Wenn Datei nicht existiert, automatisch erstellen
' und Inhalt sofort speichern
F = FreeFile
Open sFilename For Output As #F
' Datei mit Leerzeilen füllen, bis gewünschte
' Schreibposition erreicht ist
For i = 1 To LinePos - 1
Print #F, ""
Next i
' Inhalt speichern
Print #F, sLine
Close #F
Else
' Temporäre Datei erstellen
myTempFile = txt_TempFilename()
' Original-Datei zum Lesen und temporäre
' Datei zum Schreiben öffnen
F = FreeFile: Open sFilename For Input As #F
N = FreeFile: Open myTempFile For Output As #N
' Original-Datei einlesen und x. Zeile durch
' neuen Inhalt ersetzen
lRow = 0
While Not EOF(F)
lRow = lRow + 1
Line Input #F, Zeile
If lRow = LinePos Then
' x. Zeile durch neuen Inhalt ersetzen
Zeile = sLine
End If
Print #N, Zeile
Wend
' sollte LinePos größer sein, als die bisherige
' Anzahl gespeicherter Zeilen in der Orginaldatei
' wurde der neue Inhalt noch nicht gespeichert
' und die Datei muss ggf. noch mit zusätzlichen
' Leerzeilen gefüllt werden!
If lRow ' Ggf. mit Leerzeilen füllen
For i = lRow + 1 To LinePos - 1
Print #N, ""
Next i
' Neuen Zeilen-Inhalt speichern
Print #N, sLine
End If
' Dateien schliessen
Close #F: Close #N
' Alte Datei löschen
Kill sFilename
' temporäre Datei in "alte" Datei umbenennen
FileCopy myTempFile, sFilename
Kill myTempFile
End If
End Sub
'Ein paar Beispiele
'Im nachfolgend ein paar Beispiele, um Ihnen die Funktionen ein wenig näher zu bringen.
'Datei myFile.txt erstellen und Inhalt einer MultiLine-Textbox speichern
'txt_WriteAll "myFile.txt", Text1.Text
'3. Zeile der Datei myFile.txt auslesen und in einer MsgBox anzeigen
'MsgBox txt_ReadLine("myFile.txt", 3)
'3. Zeile der Datei durch den Text "Hallo, ich bin's" ersetzen
'txt_WriteLine "myFile.txt", 3, "Hallo ich bin's"
'Und hier nochmals alle Funktionen im Überblick
'txt_ReadAll Liest des gesamten Inhalt einer Textdatei und gibt diesen als String zurück
'txt_ReadLine Liest den Inhalt einer bestimmten Textzeile gibt diesen als String zurück
'txt_AppendLine Fügt einen Inhalt an das Ende einer Textdatei an
'txt_WriteAll Speichert einen Inhalt in eine Textdatei, wobei der bisherige Inhalt überschrieben wird
'txt_WriteLine Speichert den Inhalt einer bestimmten Textzeile - angegeben durch die Zeilennummer
Anzeige
AW: Datei Byteweise einlesen
08.12.2005 20:20:07
Matthias
Hallo Iwanowitsch,
den Link zu posten hätte es auch getan bzw. wäre sogar interesant (welche Site?)
Gruß Matthias
AW: Vielen Dank! - o.T.
08.12.2005 20:57:56
Matthias
:-)
AW: Datei Byteweise einlesen
08.12.2005 22:13:03
MichaV
Hallo Reinhardt,
dann nimmst Du FOR BINARY.
Das ist aber nicht so hopplahopp getan wie bei Textdateien, da musst Du schon genau wissen, was Du vor hast.
Hast Du überhaupt was Bestimmtes vor?
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: Datei Byteweise einlesen
08.12.2005 23:57:02
Reinhard
Hallo Micha,
nein nichts Bestimmtes, nur das prinzipielle Byteweise Einlesen einer Datei, sagen wir einer .bmp Datei als Beispiel. Und ich weiss aus der Erinnerung dass ich da immer Probleme habe, Problem= 0,5-2 Stunden bis ich das so habe wie ich es will.
Der gepostete Code war ja hauptsächlich für Textdateien, da muss ich mir die Feinheiten noch anschauen, aber da habe ich weniger Probleme da einfacher.
Und dann hätte ich auch gern mehr Wissen wie man das am effektivsten Macht, also am schnellsten, neudeutsch hohe Performance.
Abver ich sehe schon, jetzt da ich konkreter darüber nachdenke, und da ich letzlich alle Möglichkeiten wissen will, ich muss das selbst austesten.
Danke für deine Mühen.
Gruß
Reinhard
Anzeige
AW: Datei Byteweise einlesen
09.12.2005 13:00:37
MichaV
Hallo Reinhardt,
hier mal ein Beispiel:

Option Explicit
Sub Schreiben()
'Ein Integer- Datenfeld in eine Datei schreiben
'Super einfache Möglichkeit, komplexe Variablen (Arrays oder benutzerdefinierte Typen) in eine Datei zu schreiben.
Dim i As Integer
Dim x(1 To 10) As Integer
For i = 1 To 10: x(i) = i * 10 : Next i
Open "e:\privat\test.dat" For Binary As #1
Put #1, , x
Close #1
End Sub
'aus dieser Datei lesen
Sub Lesen()
Dim a(1 To 10) As Long '!als Long deklariert
Dim b As Integer '!nicht als Datenfeld deklariert
Dim c (1 to 10) As Integer
Open "e:\privat\test.dat" For Binary As #1
Get #1, , a
Get #1, 5, b 'einen Integer (b) ab der 5. Position der Datei auslesen -> Ein Integer Wert besteht aus 2 Bytes.
'In der Datei wurden mehrere Integer- Werte ab der 1. Position gespeichert (das mußt Du wissen!)
'Also steht in der 1. und 2. Position der Datei der erste Integer (x(1)=10),
'in der 3. und 4. Position der 2. Integer (x(2)=20) und ab der 5. Position der 3. Integer- Wert (30)
Get #1, 1, c 'weil c wie x deklariert wurde, werden hier alle Daten korrekt eingelesen
Close #1
MsgBox a(3) 'Falscher Wert, weil Variable als Long deklariert, Wert aber als Integer gespeichert
MsgBox b
MsgBox c(3)
End Sub

Du musst also genau wissen, welche Daten(-Typen) sich wo in der Datei befinden, um diese richtig auslesen zu können. Bei selbst erstellten Dateien ist das oft kein Problem, bei z.B. bmp- Dateien stehen die Informationen im Header der Datei, dessen Struktur bekannt sein muss. Anhand dieser Infos können dann die eigentlichen Daten der Datei abgegriffen werden.
Gruss- Micha
Anzeige
Klasse, genauso, merci :-) o.w.T.
09.12.2005 17:27:24
Reinhard
Gruß
Reinhard
ps:Das Forum lebt auch von Rückmeldungen

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige