vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 16.10.17 15:59

Hallo liebe Community, ich bin leider nicht allzusehr Vertraut mit Visual Basic,
stehe aber leider derzeit vor einer mir unlösbaren Aufgabe. Vielleicht erbarmt sich jemand
von euch und kann mir ein paar Tipps geben oder gar eine Hilfestellung.

Ferner bekomme ich eine CSV, und diese muss manipuliert/geändert werden.
Anschließend soll das Skript die Datei überspeichern und verschieben.

Der Inhalt der CSV Datein sieht wie folgt aus:

NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
  Mustermann;Musterstraße _
  14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"0130000000" & _
  "000;01300000000001;01300000000002;01300000000003";P195807;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"0;01300000000001;01300000000002;01300000000003";P195808;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"0;01300000000001;01300000000002;01300000000003";P195809;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"0;01300000000001;01300000000002;01300000000003";P195810;02.10.2017 09:46
Es kann allerdings auch passieren, dass der Inhalt der Datei nur eine Zeile beinhaltet.
Genauer geht es um folgende Felder:

"01300000000000;01300000000001;01300000000002;01300000000003"
Hierbei handelt es sich um Sendungsnummern eines Paketdienstleisters, die im Anschluss in eine Software importiert werden müssen, das Programm
dass die Csv ausgibt diese aber leider hierfür falsch exportiert. Die obig referierten Zeilen müssten wie folgt aussehen:

NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
  Mustermann;Musterstraße _
  14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"0130000000" & _
  "000";P195807;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"1";P195808;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"2";P195809;02.10.2017 09:46
NP;0.0000;;;;;;;;;;;A835555;A835555;Musterstraße 14;;;Max _
Mustermann;Musterstraße _
14;;DE;123456;Musterhausen;;;test@tester.de;www.panorama24.eu;;;;"013000000000" & _
"3";P195810;02.10.2017 09:46
Die Paketnummern sind immer 14 Stellig. Nun meine Frage, gibt es eine Möglichkeit, dass mann sagt, wenn der nummerische wert 14 Stellig ist, dann packe die nächste ID in die zweite Zeile und überschreibe den falschen Wert usw...

Danke euch im Voraus
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: Manfred X
Datum: 16.10.17 16:31

Hallo!

Deine Erklärungen sind nicht eindeutig.
Woran kann man erkennen, welche Sendungsnummer (z.B. 0130000000003)
sich auf welche Paketnummer (z.B. P195810) beziehen soll?
So weit ich verstanden habe, kann das aufgrund Deiner "Angaben"
vermutlich nur funktionieren, falls max. 4 (bzw. n) Einträge in jeweils
einer CSV-Datei stehen (=ein "Datenpaket") - und zwar in geordneter Folge
gemäß Sendungsnummern (Zeilenreihung als Information).

Was bedeutet z.B. Deine Aussage:
[I]"Es kann allerdings auch passieren, dass der Inhalt der Datei nur
eine Zeile beinhaltet."[/I]
Ist die Zahl der Datei-Zeilen mit der Zahl der ausgegebenen Sendungsnummern
koordiniert (z.B. pro Paket der Gesamt-Sendung wird eine Zeile erzeugt)?

Beitrag wurde zuletzt am 16.10.17 um 16:37:27 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 25.10.17 08:20

Hallo Manfred X, vielen Dank erstmal für deine Antwort. Ich versuche das Problem mal etwas genauer darzustellen:

Vorerst der Ablauf wie er aktuell ist und wie er sein soll:
http://mindhackers.de/ablauf.jpg

Hier nochmal wie der Import aktuell aussieht: http://mindhackers.de/ablauf2.jpg

Zur Erzeugung der csv Dateien, diese werden wie folgt ausgegeben:

1 Datei pro Kunde (samt aller Pakete). Die Warenwirtschaft gibt die Datei aus in einen Ordner, im Anschluss guckt das Versandprogramm jede Sekunde in diesen Ordner ob dort eine Datei liegt. Wenn dies der Fall ist, nimmt er die Datei und erzeugt Sendungsdaten und druckt die Paketscheine im Anschluss. Nach der Erzeugung der Sendungsdaten verschiebt das Versandprogramm die zuvor von der Warenwirtschaft erzeugte Datei und fügt die Sendungsdaten an (hier gibt es leider kein Templatetool). Jetzt kommt das Warenwirtschaftsprogramm und guckt ebenfalls in dem Export Ordner und liest alle 15 Sekundne falls vorhanden die Dateien ein.

Derzeit liegt der Fehler in folgendem Format. Das Versandtool schreibt in jede Zeile Alle erzeugten paketnummern, dass diese nach dem Semikolon zu trennen und der Reihenfolge nach in die Zeilen zu schreiben.

Versanddaten habe ich hier hochgeladen als zip: http://mindhackers.de/exportdaten.zip

Danke im Voraus
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 25.10.17 11:37

Hallo
Da könnte man etwas mit der TextFieldParser-Klasse machen.

Annahmen:
- Paketnummer n gehört zu Zeile n
- Paketnummer steht immer an 31. Stelle
Imports System.IO
Imports System.Text
Private Sub FixCSV(ByVal path As String)
    Using tfp As Microsoft.VisualBasic.FileIO.TextFieldParser = New _
      Microsoft.VisualBasic.FileIO.TextFieldParser(path, Encoding.Default)
        tfp.SetDelimiters(";")
        Using sw As StreamWriter = New StreamWriter(path.Replace(".csv", _
          "_new.csv"), 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
Gruss HenryV
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 25.10.17 13:22

Hi HenryV,
vielen Dank für deine Antwort. In der Tat treffen beide deiner Annahmen immer zu.
Nun noch eine kurze und warschl. dumme Frage: Wie kriege ich das in folgende Form eingebaut:

http://mindhackers.de/startstop.png

Danke nochmal vielmals.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 25.10.17 14:00

Ich verstehe deine Frage nicht ganz.
Aber wenn es darum geht einen Ordner zu überwachen, könnte man es z.B. mit der Timer-Klasse oder der FileSystemWatcher-Klasse realisieren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 25.10.17 14:52

Ich würde gerne folgende Gui an das Script anbinden, sodass man das Programm starten und beenden kann, sowie den Pfad anpassen kann, sofern dieser sich mal ändert o.ä.

Eine dauerhafte Überwachung wäre unbedingt erforderlich, beispielsweise im Sekunden Rhythmus.
Vllt. kannst Du mir dabei ebenfalls helfen.
Schon jetzt mehr als Danke für deine Hilfe!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 25.10.17 16:56

Hier einmal eine Lösung mit dem FileSystemWatcher: (Ich hatte noch ein bisschen Zeit übrig)

Eine Form mit btnStart (Button), btnStop (Button), tbImport (TextBox), tbExport (TextBox), llbImport (LinkLabel) und llbExport (LinkLabel)
dazu zwei Einstellungen ImportPfad (String) und ExportPfad (String). Anleitung
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(sender As Object, 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(sender As Object, 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, 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(source As Object, 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(sender As Object, 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(sender As Object, 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(sender As Object, e As EventArgs) Handles Me.Load
        tbExport.Text = My.Settings.ExportPfad
        tbImport.Text = My.Settings.ImportPfad
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 26.10.17 08:35

Wow, vielen vielen Dank HenryV. Das ist ja doch ein bisschen mehr Code als ich dachte.
Ich habe nun alles genauso wie beschrieben eingebunden, Visual Basic gibt mir auch keinerlei Fehler aus, nur leider passiert nichts wenn ich auf Start drücke. Habe ich irgendwas vergessen?

Link zum Projekt: http://mindhackers.de/exportversand.zip

Danke nochmal für deine unglaubliche Hilfe!

Beitrag wurde zuletzt am 26.10.17 um 08:35:52 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 26.10.17 09:37

Nein hast du nicht.
Beim drücken des Start-Knopfes wird der Ordner, welcher als Importpfad angegeben ist, überwacht.
Sobald eine csv-Datei im Ordner erscheint, wird diese bearbeitet und im Exportpad gespeichert.
(Die Pfade sollten unterschiedlich sein.)

Ich habe nach nochmaligen Testen festgestellt, dass beim Speichern der csv-Datei im Importpfad eine FileNotFoundException geworfen wird. Durch auskommentieren/löschen der Zeile "AddHandler watcher.Created, AddressOf OnChanged" wird dies aber behoben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 26.10.17 10:05

Ich habe die betreffende Zeile nun auskommentiert, leider findet nach wie vor keine Aktion statt.
Hier nochmal ein Bild: http://mindhackers.de/changed.png

Liebe Grüße
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 26.10.17 15:15

Das letzte was ich mit vorstellen kann, was nicht klappt wäre der Filter des FileSystemWatchers. Der ist nämlich "case sensitiy"("*.csv != "*.CSV").
Ändere einmal die Zeile watcher.Filter = "*.csv" zu watcher.Filter = "*.*"

Falls das klappt und du die Dateitypabfrage brauchst, kann man die dann im OnChanged-Event einbauen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 27.10.17 07:36

Guten Morgen, habe die Zeile nun abgeändert:

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"
        watcher.Filter = "*.*"
        ' Add event handlers.
        AddHandler watcher.Changed, AddressOf OnChanged
        ' AddHandler watcher.Created, AddressOf OnChanged
 
        btnStop.Enabled = False
        tbExport.ReadOnly = True
        tbImport.ReadOnly = True
 
    End Sub
Leider ohne Erfolg. Ich habe ebenfalls die CSV ohne Sonderzeichen etc abgeändert in: "test.csv". Leider ebenfalls ohne Erfolg. Hat die Manipulation denn bei dir funktioniert?

Danke im Voraus

Liebe Grüße

Beitrag wurde zuletzt am 27.10.17 um 07:36:45 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 27.10.17 08:40

Folgende Szenarien funktionieren bei mir tadellos. (auch mit deiner hochgeladenen Version)
-csv-Datei wird in Import-Ordner kopiert/verschoben.
-csv-Datei wird in Import-Ordner gespeichert.
Die konvertierte Datei erscheint dann umgehend im Export-Ordner.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 27.10.17 09:54

Kannst Du die Projektdatei einmal hochladen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: HenryV
Datum: 27.10.17 12:14

IMHO nicht nötig, da dein Projekt bei mir ja auch ohne abzuändern funktioniert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: effeff
Datum: 27.10.17 20:45

Das zu überwachende Verzeichnis hast Du auch korrekt übergeben?

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: CSV- Datei ändern und im Anschluss verschieben 
Autor: p24
Datum: 28.10.17 22:16

Hallo effeff,
Ja der Pfad ist definitv richtig. Leider wird keine Aktion ausgeführt.

Gruß
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel