| |
VB.NET - Ein- und UmsteigerCSV- 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 | |
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. | |
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 | |
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 | |
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. | |
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. | |
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! | |
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 | |
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. | |
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. | |
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 | |
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. | |
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. | |
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. | |
Re: CSV- Datei ändern und im Anschluss verschieben | | | Autor: p24 | Datum: 27.10.17 09:54 |
| Kannst Du die Projektdatei einmal hochladen? | |
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. | |
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 | |
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ß | |
| 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 |
|
|
Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|