pfeffis 11 Geschrieben 29. Mai 2009 Melden Teilen Geschrieben 29. Mai 2009 Hallo Gemeinde! Folgende Problematik... Es kommen Files (SLSRPT) im EDIFACT Format an, werden in s inhouse Format umgewandelt und dann eingelesen vom ERP System. Soweit so gut. Dieses inhouse File sieht ungefähr so aus: SYNTAX;SLSRPT;D;96A;9999999999991;9999999999995 KOPSLS;0000087;20090525;;;9999999999995;9999999999991;EUR; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; ORTSLS;9008477000005;;;2;4001111111111;;;;;;1+;PCE;6744;;;; KOPSLS;0000087;20090518;;;9999999999995;9999999999991;EUR; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; ORTSLS;9008477000005;;;2;4001111111111;;;;;;1+;PCE;6744;;;; KOPSLS;0000087;20090519;;;9999999999995;9999999999991;EUR; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; ORTSLS;9008477000005;;;2;4001111111111;;;;;;1+;PCE;6744;;;; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; ORTSLS;9008477000005;;;2;4001111111111;;;;;;1+;PCE;6744;;;; KOPSLS;0000087;20090520;;;9999999999995;9999999999991;EUR; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; ORTSLS;9008477000005;;;2;4001111111111;;;;;;1+;PCE;6744;;;; ORTSLS;9008477000005;;;1;4001111111111;;;;;;1+;PCE;674;;;; Alle KOPSLS bis auf die erste werden mit folgendem Script gelöscht: Sub Main() Dim datei As String Dim datei2 As String Const pfad = "\\edi\import\" Dim kopfgefunden As Boolean 'Dim i 'datei = pfad & Right$(My.Application.CommandLineArgs.Item(1), 9) 'MsgBox(datei) 'For i = 1 To My.Application.CommandLineArgs.Count ' MsgBox(My.Application.CommandLineArgs.Item(i - 1)) ' If File.Exists(datei) Then MsgBox("ja") 'Next i If My.Application.CommandLineArgs.Count = 3 Then 'datei = My.Application.CommandLineArgs.Item(0) datei = My.Application.CommandLineArgs.Item(0) datei2 = My.Application.CommandLineArgs.Item(1) kopfgefunden = False 'datei2 = Left$(datei, Len(datei) - 4) & "_OK.inh" Try ' Create an instance of StreamReader to read from a file. Using sr As StreamReader = New StreamReader(datei) Dim line As String Dim sr2 = New StreamWriter(datei2, False) ' Read and display the lines from the file until the end ' of the file is reached. Do line = sr.ReadLine() If Left(line, 6) <> "KOPSLS" Then sr2.writeline(line) Else If kopfgefunden = False Then kopfgefunden = True sr2.writeline(line) End If End If Loop Until sr.EndOfStream sr.Close() sr2.close() End Using 'File.Delete(pfad & datei) Catch E As Exception Console.WriteLine("The file could not be read:") Console.WriteLine(E.Message) End Try Else Console.WriteLine("Bitte geben sie den Dateinamen der Salesreportdatei an !") End If End Sub Ich möchte aber vorher, dass das Datum aus der 2ten und aus der letzten Kopfzeile in die 1te Kopfzeile geschrieben werden und erst dann alle KOPSLS außer natürlich der 1ten gelöscht werden. Hintergrund: In der 1ten Kopfzeile steht nur das Übertragungsdatum 20090525. In der 2ten bis zur letzten stehen die jeweiligen Verkaufstage. Daher brauche ich die 2te und die letzte Kopfzeile in der 1ten Kopfzeile um den Zeitraum einlesen zu können. Ich hoffe ihr könnt mir folgen und habt hier einen Ansatz parat? Viele Grüße Zitieren Link zu diesem Kommentar
pfeffis 11 Geschrieben 23. Juni 2009 Autor Melden Teilen Geschrieben 23. Juni 2009 Bin hierzu leider noch immer nicht wirklich weiter gekommen, daher nochmal ein "Auffrischungskommentar" ;). Vielleicht hat ja doch noch jemand eine Idee? Grüße Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 23. Juni 2009 Melden Teilen Geschrieben 23. Juni 2009 Hi, wo genau sollen die Daten denn dann in die 1.Kopfzeile eingefügt werden? Sowas in der Art: KOPSLS;0000087;20090525;20090518;20090520;9999999999995;9999999999991;EUR; also Anfangs- und Enddatum in die leeren Felder hinter dem 1.Datum? Um die Daten aus "line" komfortabel bearbeiten zu können, bietet sich die Split-Funktion an: arrFields = Split(line, ";") strSyn = arrFields(0) ' also KOPSLS bzw. ORTSLS strDate = arrFields(3) ...usw. Zitieren Link zu diesem Kommentar
pfeffis 11 Geschrieben 23. Juni 2009 Autor Melden Teilen Geschrieben 23. Juni 2009 Hallo! Vielen Dank für deine Anregungen. Es soll so aussehen KOPSLS;0000087;20090520;20090518;;9999999999995;9999999999991;EUR; Somit entfällt in der 1. Kopfzeile das Übertragungsdatum und wird mit der letzten Kopfzeile (Datum) ersetzt. Als weiteres Datum kommt das aus der 2. Kopfzeile dahinter. Somit entfäält auch ein ";" aus der 1. Kopfzeile. Das war s dann eigentlich auch schon ;) Hoffe man kann verstehen was ich will ? Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 23. Juni 2009 Melden Teilen Geschrieben 23. Juni 2009 So was in der Art davor setzen (ggf. Arrays noch passend dimensionieren), hinterher Datei wieder zurücksetzen (sr.movefirst oder schliessen und wieder öffnen) Do line = sr.ReadLine() If Left(line, 6) = "KOPSLS" Then if cntHead = 0 then strHead = line arrHead = Split(line,";") strDate(cntHead) = arrHead(2) cntHead = cntHead + 1 End If Loop Until sr.EndOfStream strHead = Replace(strHead,strDate(0) & ";",strDate(1) & ";" & strDate(cntHead-1)) und in der Schleife darunter noch line durch strHead ersetzen If kopfgefunden = False Then kopfgefunden = True sr2.writeline(strHead) End If Zitieren Link zu diesem Kommentar
pfeffis 11 Geschrieben 24. Juni 2009 Autor Melden Teilen Geschrieben 24. Juni 2009 Tausend Dank Cybquest. Wie immer super Hilfe von dir -schleim ;) Habe den Code jetzt wie folgt angepasst. Die sr.movefirst Geschichte ist mir nicht so ganz klar. Sub Main() Dim datei As String Dim datei2 As String Const pfad = "\\edi\import\" Dim kopfgefunden As Boolean If My.Application.CommandLineArgs.Count = 3 Then 'datei = My.Application.CommandLineArgs.Item(0) datei = My.Application.CommandLineArgs.Item(0) datei2 = My.Application.CommandLineArgs.Item(1) kopfgefunden = False Try ' Create an instance of StreamReader to read from a file. Using sr As StreamReader = New StreamReader(datei) Dim line As String Dim sr2 = New StreamWriter(datei2, False) Do line = sr.ReadLine() If Left(line, 6) = "KOPSLS" Then If cntHead = 0 Then strHead = line arrHead = Split(line, ";") strDate(cntHead) = arrHead(2) cntHead = cntHead + 1 End If Loop Until sr.EndOfStream strHead = Replace(strHead, strDate(0) & ";", strDate(1) & ";" & strDate(cntHead - 1)) ' Read and display the lines from the file until the end ' of the file is reached. Do line = sr.ReadLine() If Left(line, 6) <> "KOPSLS" Then sr2.writeline(line) Else If kopfgefunden = False Then kopfgefunden = True sr2.writeline(strHead) End If 'If kopfgefunden = False Then ' kopfgefunden = True ' sr2.writeline(line) 'End If End If Loop Until sr.EndOfStream sr.Close() sr2.close() End Using 'File.Delete(pfad & datei) Catch E As Exception ' Let the user know what went wrong. Console.WriteLine("The file could not be read:") Console.WriteLine(E.Message) End Try Else Console.WriteLine("Bitte geben sie den Dateinamen der Salesreportdatei an !") End If End Sub Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 24. Juni 2009 Melden Teilen Geschrieben 24. Juni 2009 Nu ja zwischen Loop Until sr.EndOfStream und Do line = sr.ReadLine() sollte der Streamreader ja irgendwie wieder auf Anfang gesetzt werden. Habs selber nur mit VB-Script getestet (ohne Streamreader). Für den .NET Streamreader weiß ich grad keine passende Methode ;) Zitieren Link zu diesem Kommentar
pfeffis 11 Geschrieben 24. Juni 2009 Autor Melden Teilen Geschrieben 24. Juni 2009 Nochmal danke Cybquest. Habe zwar noch reichlich Fehler hier, werde mich aber mal weiter durchquälen. Grüße Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.