Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Visual Basic Programm Optimierung

Frage Entwicklung Visual Studio

Mitglied: Praktikantin

Praktikantin (Level 1) - Jetzt verbinden

09.11.2009 um 00:48 Uhr, 3719 Aufrufe, 8 Kommentare

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 -->

01.
 System.IO 
02.
Imports System.Collections 
03.
Imports System.Text 
04.
Imports System.Text.RegularExpressions 
05.
Public Class Form1 
06.
 
07.
 
08.
    '-- code behind the main form 
09.
 
10.
    '-- Declare Private Members 
11.
    Private fName As String 
12.
    Private txt As String 
13.
    Private NewText As String 
14.
 
15.
    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click 
16.
        '-- Open the CSV file using the Open File Dialog. 
17.
 
18.
        OpenCSVFile() 
19.
        '-- Read from the CSV file 
20.
        ReadFromFile() 
21.
        '-- Write and Save Modified file 
22.
        WriteModifiedCSVFile() 
23.
    End Sub 
24.
 
25.
    Private Sub OpenCSVFile() 
26.
        If OpenFileDialog1.ShowDialog = (Windows.Forms.DialogResult.OK) Then 
27.
            Try 
28.
                '-- Open the file 
29.
                fName = OpenFileDialog1.FileName 
30.
            Catch ex As IOException 
31.
                MessageBox.Show("Couldn't open the file") 
32.
            End Try 
33.
        End If 
34.
    End Sub 
35.
 
36.
    Private Sub ReadFromFile() 
37.
        '-- Open file and launch StreamReader 
38.
        Dim reader As StreamReader 
39.
        '-- Read all text to the end. 
40.
 
41.
        Dim iBuffer As Integer, readBuffer As String, readLine As String 
42.
        readLine = "" 
43.
        Dim MsgIdentity As String = "" 
44.
        '''''   Dim regX As New Regex("\,") '<-- Will m 
45.
        ' ''<-- Replace all comma (,) characters with dot (.) character. 
46.
 
47.
        If fName <> "" Then 
48.
            reader = New StreamReader(New FileStream(fName, FileMode.Open)) 
49.
            iBuffer = reader.Read 
50.
            While iBuffer > 0 
51.
                readBuffer = ChrW(iBuffer) 
52.
 
53.
                If readBuffer <> """" Then 
54.
                    readLine += readBuffer 
55.
                Else 
56.
                    '' If readLine.Substring(0, 1) = """" Then 
57.
                    MsgIdentity += readBuffer 
58.
 
59.
                    Do 
60.
                        iBuffer = reader.Read 
61.
                        readBuffer = ChrW(iBuffer) 
62.
                        'readBuffer = Chr(iBuffer) 
63.
                        MsgIdentity += readBuffer 
64.
                    Loop Until readBuffer = """" 
65.
                    '''' regX.Replace(MsgIdentity, ".") 
66.
                    readLine += Replace(Replace(MsgIdentity, ",", "."), """", "") 
67.
                    MsgIdentity = "" 
68.
 
69.
                End If 
70.
                ''readLine = "" 
71.
                iBuffer = reader.Read 
72.
            End While 
73.
 
74.
        End If 
75.
        reader.Close() 
76.
        NewText = ReplaceQuotations(readLine) 
77.
 
78.
    End Sub 
79.
 
80.
    Private Function ReplaceCommas(ByVal text As String) As String 
81.
        '-- Declare local variable 
82.
        Dim regX As New Regex("\,") '<-- Will m 
83.
        '<-- Replace all comma (,) characters with dot (.) character. 
84.
        Return regX.Replace(text, ".") 
85.
    End Function 
86.
 
87.
    Private Function ReplaceQuotations(ByVal text As String) As String 
88.
        '-- Declare local variable 
89.
        Dim regX As New Regex("\""") 
90.
        '<-- Replace all comma (,) characters with dot (.) character. 
91.
        Return regX.Replace(text, "") 
92.
    End Function 
93.
    Private Function ReplaceNumber9_1(ByVal text As String) As String 
94.
        '-- Declare local variable 
95.
        '-- Declare local variable 
96.
        Dim regX As New Regex("9,1") 
97.
        '<-- Replace all (9,1) with (9.1). 
98.
        Return regX.Replace(text, "9.1") 
99.
    End Function 
100.
    Private Sub WriteModifiedCSVFile() 
101.
        '-- Write the passed text in the specified file 
102.
        '-- and create the new file. 
103.
        Dim writer As StreamWriter = File.CreateText(fName) 
104.
 
105.
        '-- Write text to sream 
106.
        writer.Write(NewText) 
107.
        '-- Close the stream 
108.
        writer.Close() 
109.
    End Sub 
110.
 
111.
    Private Sub btnOpen_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click 
112.
 
113.
    End Sub 
114.
 
115.
    Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk 
116.
 
117.
    End Sub 
118.
End Class 
119.
 
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...

01.
 
02.
 Private Sub ReadFromFile() 
03.
        '-- Open file and launch StreamReader 
04.
        Dim reader As StreamReader 
05.
        '-- Read all text to the end. 
06.
 
07.
        Dim iBuffer As Integer, readBuffer As String, readLine As String 
08.
        readLine = "" 
09.
        Dim MsgIdentity As String = "" 
10.
        '''''   Dim regX As New Regex("\,") '<-- Will m 
11.
        ' ''<-- Replace all comma (,) characters with dot (.) character. 
12.
 
13.
        If fName <> "" Then 
14.
            reader = New StreamReader(New FileStream(fName, FileMode.Open)) 
15.
            iBuffer = reader.Read 
16.
            While iBuffer > 0 
17.
                readBuffer = ChrW(iBuffer) 
18.
 
19.
                If readBuffer <> """" Then 
20.
                    readLine += readBuffer 
21.
                Else 
22.
                    '' If readLine.Substring(0, 1) = """" Then 
23.
                    MsgIdentity += readBuffer 
24.
 
25.
                    Do 
26.
                        iBuffer = reader.Read 
27.
                        readBuffer = ChrW(iBuffer) 
28.
                        'readBuffer = Chr(iBuffer) 
29.
                        MsgIdentity += readBuffer 
30.
                    Loop Until readBuffer = """" 
31.
                    '''' regX.Replace(MsgIdentity, ".") 
32.
                    readLine += Replace(Replace(MsgIdentity, ",", "."), """", "") 
33.
                    MsgIdentity = "" 
34.
 
35.
                End If 
36.
                ''readLine = "" 
37.
                iBuffer = reader.Read 
38.
            End While 
39.
 
40.
        End If 
41.
        reader.Close() 
42.
        NewText = ReplaceQuotations(readLine) 
43.
 
44.
    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
Mitglied: TsukiSan
09.11.2009 um 03:43 Uhr
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:

01.
Dim MyFile, MeineCSVDatei, MeineCSVDAteiNew 
02.
Dim TextNeuA, TextNeuB 
03.
Dim TextLineNew 
04.
 
05.
MeineCSVDatei = "C:\Test.txt" 
06.
MeineCSVDAteiNew = "C:\Test.txt.csv" 
07.
 
08.
Set FSO = CreateObject("Scripting.FileSystemObject") 
09.
 
10.
SET MyFileNeu = FSO.CreateTextFile(MeineCSVDAteiNew, True) 
11.
 MyFileNeu.Close 
12.
 
13.
Set MyFile = FSO.OpenTextFile(MeineCSVDatei, 1) 
14.
 
15.
SET MyFileNeu = FSO.OpenTextFile(MeineCSVDAteiNew, 8) 
16.
 
17.
Do Until MyFile.AtEndOfStream  
18.
 
19.
	MeineDatei = MyFile.ReadLine 
20.
    	MeineDatei = Split(MeineDatei, CHR(34)) 
21.
	TextNeuA = MeineDatei(0) 
22.
	TextNeuB = MeineDatei(1) 
23.
	TextNeuB = Replace(TextNeuB,",",".") 
24.
	TextNeuB = Replace(TextNeuB,CHR(34),"") 
25.
	MyFileNeu.WriteLine (TextNeuA & TextNeuB)  
26.
 
27.
Loop 
28.
 
29.
MyFile.Close 
30.
MyFileNeu.Close 
31.
 
32.
Set FSO = nothing 
33.
Set MyFile = nothing 
34.
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
Bitte warten ..
Mitglied: SlainteMhath
09.11.2009 um 09:48 Uhr
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
Bitte warten ..
Mitglied: Praktikantin
09.11.2009 um 10:06 Uhr
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 Würde mich aber wirklich interessieren wie das gehen würde...

Vielen Dank fuer alles!!!

Viele Grüsse

Praktikantin
Bitte warten ..
Mitglied: SlainteMhath
09.11.2009 um 10:11 Uhr
Pseudo Code:

01.
1. Zeile Lesen aus Datei1 
02.
2. Zeile verändern 
03.
3. Zeile schreiben in Datei1_temp 
04.
4. Wiederhole bis zum Ende von Datei1 
05.
5. kopiere Datei1_temp nach Datei1 
06.
6. Lösche Datei1_temp
Bitte warten ..
Mitglied: Praktikantin
09.11.2009 um 10:16 Uhr
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
Bitte warten ..
Mitglied: 76109
09.11.2009 um 12:24 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
09.11.2009 um 15:27 Uhr
...dann koenten wir dein Programm weiter anpassen.

Gruss
Tsuki
Bitte warten ..
Mitglied: Praktikantin
09.11.2009 um 16:16 Uhr
Οκ,

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

Praktikantin
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Visual Studio
gelöst Remotedienst prüfen mit Visual Basic (1)

Frage von flyingmichael zum Thema Visual Studio ...

Visual Studio
Mit Visual Basic auf Shopware 5 API zugreifen (9)

Frage von SmogKiel zum Thema Visual Studio ...

Visual Studio
gelöst Pastebin auslesen mit Visual Basic? (2)

Frage von UltraZz zum Thema Visual Studio ...

Basic
gelöst Mit Visual Basic Batch Datei öffnen (26)

Frage von Flodsche zum Thema Basic ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...