none
Fehler in Code aber wo? RRS feed

  • Allgemeine Diskussion

  • Guten Morgen liebe Community.

    Ich schreibe derzeit ein kleines Tool, das CSV Dateien manipulieren soll. Ferner guckt das Tool ob in einem angegebenen Order sich eine CSV befindet und schreibt diese um. Im Anschluss verschiebt das Programm die Datei usw usw.. Leider wird keine Aktion ausgeführt und der Debugger meldet keine Fehler.. Ich bin ratlos. Vielleicht kann mir jemand von euch auf die schnelle Helfen. Danke hierfür vielmals im Voraus!

    Zum Programm:


    Hier der Link zur Projektdatei: Prjektdatei als *zip

    Hier mein Code:

    Imports System.IO
    Imports System.Text
    Public Class Form1
        Private watcher As New FileSystemWatcher()
    
        Public Sub New()
            ' Dieser Aufruf ist für den Designer erforderlich.
            InitializeComponent()
    
            ' Watch for changes in LastAccess and LastWrite times, and the renaming 
            ' of files or directories. 
            watcher.NotifyFilter = (NotifyFilters.LastAccess Or _
              NotifyFilters.LastWrite Or NotifyFilters.FileName Or _
              NotifyFilters.DirectoryName)
            ' Only watch csv files.
            watcher.Filter = "*.csv"
            ' Add event handlers.
            AddHandler watcher.Changed, AddressOf OnChanged
            ' AddHandler watcher.Created, AddressOf OnChanged
    
            btnStop.Enabled = False
            tbExport.ReadOnly = True
            tbImport.ReadOnly = True
    
        End Sub
    
        Private Sub btnStart_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
          btnStart.Click
            If Directory.Exists(tbImport.Text) And Directory.Exists(tbExport.Text) _
            Then
                watcher.Path = tbImport.Text
                ' Begin watching.
                watcher.EnableRaisingEvents = True
                btnStart.Enabled = False
                btnStop.Enabled = True
            Else
                MessageBox.Show("Bitte beide Pfade angeben", Me.Text, _
                  MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
        End Sub
    
        Private Sub btnStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
          btnStop.Click
            ' Stop watching.
            watcher.EnableRaisingEvents = False
            btnStart.Enabled = True
            btnStop.Enabled = False
        End Sub
    
        Private Sub FixCSV(ByVal InputFilePath As String, ByVal ExportFilePath As String)
            Using tfp As Microsoft.VisualBasic.FileIO.TextFieldParser = New  _
              Microsoft.VisualBasic.FileIO.TextFieldParser(InputFilePath, _
              Encoding.Default)
                tfp.SetDelimiters(";")
                Using sw As StreamWriter = New StreamWriter(ExportFilePath, False, _
                  Encoding.Default)
                    Dim i As Integer = 0
                    Dim Zeile As String = ""
                    Do
                        Dim fields As String() = tfp.ReadFields
                        If fields Is Nothing Then Exit Do
                        For x As Integer = 0 To fields.Length - 1
                            If x = 30 Then
                                Zeile = String.Join(";"c, {Zeile, fields(x).Split( _
                                  ";"c)(i)})
                            Else
                                Zeile = String.Join(";"c, {Zeile, fields(x)})
                            End If
                        Next
                        sw.WriteLine(Zeile.Substring(1))
                        Zeile = ""
                        i += 1
                    Loop
                End Using
            End Using
        End Sub
    
        Private Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
            ' Specify what is done when a file is changed or created.
            Dim exportFilePath As String = IO.Path.Combine(tbExport.Text, _
              IO.Path.GetFileName(e.FullPath))
            FixCSV(e.FullPath, exportFilePath)
        End Sub
    
        Private Sub llbImport_LinkClicked(ByVal sender As Object, ByVal e As  _
          LinkLabelLinkClickedEventArgs) Handles llbImport.LinkClicked
            Dim dialog As New FolderBrowserDialog()
            If tbImport.Text <> "" Then dialog.SelectedPath = tbImport.Text
            If DialogResult.OK = dialog.ShowDialog() Then
                tbImport.Text = dialog.SelectedPath
                My.Settings.ImportPfad = tbImport.Text
                My.Settings.Save()
            End If
        End Sub
    
        Private Sub llbExport_LinkClicked(ByVal sender As Object, ByVal e As  _
          LinkLabelLinkClickedEventArgs) Handles llbExport.LinkClicked
            Dim dialog As New FolderBrowserDialog()
            If tbExport.Text <> "" Then dialog.SelectedPath = tbExport.Text
            If DialogResult.OK = dialog.ShowDialog() Then
                tbExport.Text = dialog.SelectedPath
                My.Settings.ExportPfad = tbExport.Text
                My.Settings.Save()
            End If
        End Sub
    
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
            tbExport.Text = My.Settings.ExportPfad
            tbImport.Text = My.Settings.ImportPfad
        End Sub
    End Class

    Mittwoch, 1. November 2017 07:10

Alle Antworten

  • ... Ferner guckt das Tool ob in einem angegebenen Order sich eine CSV befindet und schreibt diese um. Im 

    Hi,
    Dein Watcher reageirt nur auf "... wenn im angegebenen Path eine Datei oder ein Verzeichnis geändert wird ...". WEnn das Programm gestartet wird und keine csv-Datei geändert wird, dann passiert nichts.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 1. November 2017 08:00
  • Hi, ich kann mich Peter nur anschließen. Dein Programm reagiert nicht, wenn eine Datei erzeugt wird.

    Wenn ich das richtig sehe, möchtest du pro Sendungsnummer eine Zeile in deiner CSV- Datei haben. Du verwendest allerdings bei deinem TextFieldParser das ";" als Trennzeichen. Die Sendungsnummern selber sind (auf deinem Bild zumindest) auch durch ";" getrennt. Vielleicht zeigst du uns mal die Originaldaten...

    Weiter verstehe ich nicht, warum

    "Zeile = String.Join(";"c, {Zeile, fields(x).Split(";"c)(i)})" 

    nur ausgeführt werden soll, wenn der Schleifenzähler auf 30 steht, denn wenn sämtliche Felder (auch die Sendungsnummern) durch ";" getrennt sind, gibt es dort nichts zu splitten.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 1. November 2017 08:30
  • Vielen Dank für eure antworten. Vielleicht erläutere ich das Tool noch ein wenig.

    Ich habe folgendes Problem. Ich arbeite mit einem Namenhaftem Warenwirtschaftssystem und dem Programm "DPD Print" ehemals "DELISprint". Das DPD Print dient als Redundanz, da die Cloudlösung von DPD sehr oft in letzter Zeit ausgefallen ist, aufgrund von DDoS etc etc.

    Nun gibt es leider im DPD Print keinerlei Export Templates, Mapping Tools o.ä wo ich bestimmen könnte, wie die Ausgabe auszusehen hat. Wenn ich nun mehr als ein Paket in der Warenwirtschaft exportiere und mit dem DPDPrint einlese, schreibt dieses in jedes Feld (was gleichzeitig einem Paket entspricht) alle Sendungsnummern getrennt mit einem Semikolon. Somit ist die Sendungsnummer fehlerhaft importiert. Ich möchte wie auf dem obigen Bild die Sendungsnummer untereinander haben. Da die Sendungsnummern immer in der Spalte 31 stehen, wollte ich diese zertrennen und versetzt in die folgenden Zeilen schreiben.

    Mit folgender Gui wollte ich dann Importpfad und Exportpfad bestimmen.

    Hierbei entspricht der Importpfad folgendem: Exportdateien von DPDPrint

    und der Exportpfad dem Einlesepfad für die Warenwirtschaft.

    Hier sind nochmals Beispiel CSV Dateien unbehandelt.

    Beispieldateien

    Danke euch.. und beste Grüße

    Mittwoch, 1. November 2017 13:12
  • Hi,

    wie vermutet, sind sämtliche Daten mit ";" getrennt. Dadurch ergeben sich natürlich auch variable Anzahl an Felder, so wie du die Dateien liest.

    Ich würde die Datei zeilenweise einlesen und dann ab Feld x schauen, ob noch weitere Sendungsnummern folgen. 

    Bin jetzt aber erstmal unterwegs, später schaue ich nochmal rein..


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 1. November 2017 14:09
  • Bin jetzt aber erstmal unterwegs, später schaue ich nochmal rein..

    Super, vielen Dank :-)
    Donnerstag, 2. November 2017 09:55
  • Niemand eine Idee? :-(
    Freitag, 3. November 2017 08:48
  • HI,
    Ideen gibt es viele, unklar sind nur die Details der Fragestellung.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Freitag, 3. November 2017 09:29