Fragensteller
Fehler in Code aber wo?

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
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 22. November 2017 12:21
Alle Antworten
-
... Ferner guckt das Tool ob in einem angegebenen Order sich eine CSV befindet und schreibt diese um. Im
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 -
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
-
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.
-
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
-
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