praktikantin
Goto Top

Visual Basic Programm Optimierung

Benutze StreamReader zum durchlesen einer Datei aber das Programm stürzt wenn die Datei zu gross ist... Gibt es einen bessere Lösung?

Hallo zusammen!!! Bevor ich schlaffen gehe wollte ich euren Rat... Ich habe ein ganz einfaches Programm erstellt. Das hier -->

 System.IO
Imports System.Collections
Imports System.Text
Imports System.Text.RegularExpressions
Public Class Form1


    '-- code behind the main form  

    '-- Declare Private Members  
    Private fName As String
    Private txt As String
    Private NewText As String

    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
        '-- Open the CSV file using the Open File Dialog.  

        OpenCSVFile()
        '-- Read from the CSV file  
        ReadFromFile()
        '-- Write and Save Modified file  
        WriteModifiedCSVFile()
    End Sub

    Private Sub OpenCSVFile()
        If OpenFileDialog1.ShowDialog = (Windows.Forms.DialogResult.OK) Then
            Try
                '-- Open the file  
                fName = OpenFileDialog1.FileName
            Catch ex As IOException
                MessageBox.Show("Couldn't open the file")  
            End Try
        End If
    End Sub

    Private Sub ReadFromFile()
        '-- Open file and launch StreamReader  
        Dim reader As StreamReader
        '-- Read all text to the end.  

        Dim iBuffer As Integer, readBuffer As String, readLine As String
        readLine = ""  
        Dim MsgIdentity As String = ""  
        '''''   Dim regX As New Regex("\,") '<-- Will m  
        ' ''<-- Replace all comma (,) characters with dot (.) character.  

        If fName <> "" Then  
            reader = New StreamReader(New FileStream(fName, FileMode.Open))
            iBuffer = reader.Read
            While iBuffer > 0
                readBuffer = ChrW(iBuffer)

                If readBuffer <> """" Then  
                    readLine += readBuffer
                Else
                    '' If readLine.Substring(0, 1) = """" Then  
                    MsgIdentity += readBuffer

                    Do
                        iBuffer = reader.Read
                        readBuffer = ChrW(iBuffer)
                        'readBuffer = Chr(iBuffer)  
                        MsgIdentity += readBuffer
                    Loop Until readBuffer = """"  
                    '''' regX.Replace(MsgIdentity, ".")  
                    readLine += Replace(Replace(MsgIdentity, ",", "."), """", "")  
                    MsgIdentity = ""  

                End If
                ''readLine = ""  
                iBuffer = reader.Read
            End While

        End If
        reader.Close()
        NewText = ReplaceQuotations(readLine)

    End Sub

    Private Function ReplaceCommas(ByVal text As String) As String
        '-- Declare local variable  
        Dim regX As New Regex("\,") '<-- Will m  
        '<-- Replace all comma (,) characters with dot (.) character.  
        Return regX.Replace(text, ".")  
    End Function

    Private Function ReplaceQuotations(ByVal text As String) As String
        '-- Declare local variable  
        Dim regX As New Regex("\""")  
        '<-- Replace all comma (,) characters with dot (.) character.  
        Return regX.Replace(text, "")  
    End Function
    Private Function ReplaceNumber9_1(ByVal text As String) As String
        '-- Declare local variable  
        '-- Declare local variable  
        Dim regX As New Regex("9,1")  
        '<-- Replace all (9,1) with (9.1).  
        Return regX.Replace(text, "9.1")  
    End Function
    Private Sub WriteModifiedCSVFile()
        '-- Write the passed text in the specified file  
        '-- and create the new file.  
        Dim writer As StreamWriter = File.CreateText(fName)

        '-- Write text to sream  
        writer.Write(NewText)
        '-- Close the stream  
        writer.Close()
    End Sub

    Private Sub btnOpen_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click

    End Sub

    Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk

    End Sub
End Class

Ich öffne mit einem OpenfileDialog eine Textdatei und mit einem Reader durchlese ich die Datei. Mein Ziel ist es alle kommas die sich im inneren von '' " befinden mit Punkt zu ersetzen... zum beispiel -->
2,3,''Nudeln 3,4 x 2" --> Es soll so werden --> 2,3,Nudeln 3.4 x 2
Es ist eben comma delimited Text... Und bei der Artkelbezeichnung benutzt ein Typ immer Kommas... So kann ich aber die Datei nicht in meinem Sql Server importieren... Ich muss sie immer korrigieren...
Damit ich beide '' finden kann muss ich jeden einzelnen Character durchlesen...

 Private Sub ReadFromFile()
        '-- Open file and launch StreamReader  
        Dim reader As StreamReader
        '-- Read all text to the end.  

        Dim iBuffer As Integer, readBuffer As String, readLine As String
        readLine = ""  
        Dim MsgIdentity As String = ""  
        '''''   Dim regX As New Regex("\,") '<-- Will m  
        ' ''<-- Replace all comma (,) characters with dot (.) character.  

        If fName <> "" Then  
            reader = New StreamReader(New FileStream(fName, FileMode.Open))
            iBuffer = reader.Read
            While iBuffer > 0
                readBuffer = ChrW(iBuffer)

                If readBuffer <> """" Then  
                    readLine += readBuffer
                Else
                    '' If readLine.Substring(0, 1) = """" Then  
                    MsgIdentity += readBuffer

                    Do
                        iBuffer = reader.Read
                        readBuffer = ChrW(iBuffer)
                        'readBuffer = Chr(iBuffer)  
                        MsgIdentity += readBuffer
                    Loop Until readBuffer = """"  
                    '''' regX.Replace(MsgIdentity, ".")  
                    readLine += Replace(Replace(MsgIdentity, ",", "."), """", "")  
                    MsgIdentity = ""  

                End If
                ''readLine = ""  
                iBuffer = reader.Read
            End While

        End If
        reader.Close()
        NewText = ReplaceQuotations(readLine)

    End Sub

Es klappt aber nur bei kleinen Textdateien... Als ich eine 2 Mb Datei ändern wollte ist das Programm einfach abgestürzt... Zuviel Speicherverbrauch...Hat da jemand eine Idee wie ich dieses Programm Optimieren kann???
Vielen Dank im Voraus !!!!!!!!!!!!!!..


Praktikantin

Content-Key: 128910

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

Printed on: April 24, 2024 at 15:04 o'clock

Member: TsukiSan
TsukiSan Nov 09, 2009 at 02:43:06 (UTC)
Goto Top
Hallo Praktikantin,

wenn deine Dateien immer nach dem Muster:
2,3,''Nudeln 3,4 x 2" --> Es soll so werden --> 2,3,Nudeln 3.4 x 2


aufgebaut sind, dann hilft dir vielleicht dieser Script in VBS etwas:

Dim MyFile, MeineCSVDatei, MeineCSVDAteiNew
Dim TextNeuA, TextNeuB
Dim TextLineNew

MeineCSVDatei = "C:\Test.txt"  
MeineCSVDAteiNew = "C:\Test.txt.csv"  

Set FSO = CreateObject("Scripting.FileSystemObject")  

SET MyFileNeu = FSO.CreateTextFile(MeineCSVDAteiNew, True)
 MyFileNeu.Close

Set MyFile = FSO.OpenTextFile(MeineCSVDatei, 1)

SET MyFileNeu = FSO.OpenTextFile(MeineCSVDAteiNew, 8)

Do Until MyFile.AtEndOfStream 

	MeineDatei = MyFile.ReadLine
    	MeineDatei = Split(MeineDatei, CHR(34))
	TextNeuA = MeineDatei(0)
	TextNeuB = MeineDatei(1)
	TextNeuB = Replace(TextNeuB,",",".")  
	TextNeuB = Replace(TextNeuB,CHR(34),"")  
	MyFileNeu.WriteLine (TextNeuA & TextNeuB) 

Loop

MyFile.Close
MyFileNeu.Close

Set FSO = nothing
Set MyFile = nothing
Set MyFileNeu = nothing
Die Pfadangaben müssen von dir noch angepasst werden:
MeineCSVDatei = "C:\Test.txt"
MeineCSVDAteiNew = "C:\Test.txt.csv"

In meinem Script wird die Originaldatei nicht überschrieben. Teste erst einmal.


Gruß
Tsuki
Member: SlainteMhath
SlainteMhath Nov 09, 2009 at 08:48:31 (UTC)
Goto Top
Moin,

spricht was dagegen die geänderte Zeile gleich wieder auf Disk zu schreiben, anstatt alles im Speicher zu hakten und dnan am Stueck zu schreiben?

lg,
Slainte
Member: Praktikantin
Praktikantin Nov 09, 2009 at 09:06:13 (UTC)
Goto Top
Hallo zusammen und vielen dank für die schnellen Antworten!!!

Tsuki, danke fuer den VBS Code!!! Ich werde es mal gleich ausprobieren!!!

Slainte, das was Du sagst waere toll (alles sofort auf Disk zu schreiben anstatt im Speicher)... Leider habe ich mit Textdateien und Readern und so weiter nicht soviel Ahnung... Ich kenne bis jetzt nur den Stream Reader face-wink Würde mich aber wirklich interessieren wie das gehen würde...

Vielen Dank fuer alles!!!

Viele Grüsse

Praktikantin
Member: SlainteMhath
SlainteMhath Nov 09, 2009 at 09:11:51 (UTC)
Goto Top
Pseudo Code:

1. Zeile Lesen aus Datei1
2. Zeile verändern
3. Zeile schreiben in Datei1_temp
4. Wiederhole bis zum Ende von Datei1
5. kopiere Datei1_temp nach Datei1
6. Lösche Datei1_temp
Member: Praktikantin
Praktikantin Nov 09, 2009 at 09:16:58 (UTC)
Goto Top
Ok Danke,

ich werde es mal versuchen!!!

Tsuki, leider funktioniert das Script nicht weil das Muster nicht bei allen Zeilen gleich ist... Vielen Dank auf jeden Fall. Für eine Fixed Length Datei ist es auf jedem Fall super!!!

Viele liebe Grüsse Praktikantin
Mitglied: 76109
76109 Nov 09, 2009 at 11:24:36 (UTC)
Goto Top
Hallo Praktikantin!

Zitat von @Praktikantin:
Tsuki, leider funktioniert das Script nicht weil das Muster nicht bei
allen Zeilen gleich ist... Vielen Dank auf jeden Fall. Für eine
Fixed Length Datei ist es auf jedem Fall super!!!
Könntest Du das anhand von Beispielen etwas genauer erklären?

Gruß Dieter
Member: TsukiSan
TsukiSan Nov 09, 2009 at 14:27:03 (UTC)
Goto Top
...dann koenten wir dein Programm weiter anpassen.

Gruss
Tsuki
Member: Praktikantin
Praktikantin Nov 09, 2009 at 15:16:52 (UTC)
Goto Top
Οκ,

ich arbeite noch eine Stunde. Ich schreibe dann spaeter mehr Details dazu!!!! Danke fuer das Interesse und die Hilfe!!

Praktikantin