20. januar 2006 - 11:07Der er
6 kommentarer og 1 løsning
Streng manipulering, indlæs csv fil, output til ny fil
Håber at der er nogle der kan hjælpe mig, Jeg har et system som danner en csv fil til mig hver dag, problemet ligger i at de data dette program danner, skal flyttes over i vores bruger system, så alle informationer er samlet her.
Den csv fil der skal konverteres har følgende format bruger1,telefon1 bruger2,telefon2 bruger3,telefon3 bruger4,telefon4 bruger5,telefon5
Outputfil: Output filen skal se ud som følgende c:\import\import.exe user bruger1 telefon1 c:\import\import.exe user bruger2 telefon2 c:\import\import.exe user bruger3 telefon3 c:\import\import.exe user bruger4 telefon4 c:\import\import.exe user bruger5 telefon5
"c:\import\import.exe "=importpath Hvis bruger eller telefon ikke er unik, skal disse ikke skrives over i "outputfil", men skriver i en log fil. Når programmet er færdigt skal det slette indput filen (option)
Programmet skal have følgende parameter programnavn <sti til csv fil> <sti til outputfil> <sti til log fil> <importpath> <slet csvfil [y/n]
Det gør ikke noget hvis programmet læser sine parameter fra en configfil. csvfil=c:\import\userinfo.txt outputfil=c:\outputfil\konverteret.txt errorlog=c:\outputfil\error.log importpath="c:\xxxxx\xxxxx " slet_csv=n
Hvad mener du med, at output filen skal se ud som "c:\import\import.exe user bruger1 telefon1" etc.? Hvorfor står der "user" og hvad skal output filen bruges til?
Efter at filen er blevet konveteret kalder jeg "import.exe" som er et program der kan tilføje mine data i en database "user" er et parameter til dette program, som angiver bruger og telefon. Hvis jeg bruger dette program fra en dos prompt, har jeg mulighed for at tilføje nye bruger denne vej, jeg har også mulighed for at lave en import fra selve programmet af, men så er det ikke 100% automatisk, idet en person skal udføre denne handling. Problemet er også at der ikke er bygget noget check ind i denne import, om bruger/telefon findes i forvejen, hvilke kan betyde at et telefon nummer bliver brugt på flere brugere.
Når output filen er dannet, indgår denne i en schedule i windows, som herefeter afvikler denne fil fra et batch job.
Prøv med følgende. Opret et nyt projekt af typen ConsoleApplication, slet Module1.vb fra projektet, tilføj en ny klasse ved navn General.vb, og copy/paste følgende kode:
Imports System.IO
Public Class General Public Shared Function Main(ByVal Params() As String) As Int32 Dim InFile, OutFile, LogFile, ImportFile As String Dim Line, User, Phone, ErrText As String Dim Users As Hashtable Dim DeleteInFile As Boolean = False Dim OutWriter, LogWriter As StreamWriter Dim Reader As StreamReader Dim LineNumber, LineCount As Int32 Console.WriteLine("")
For Each Param As String In Params If Param.Length > 2 Then Select Case Param.Substring(0, 2).ToLower Case "i:" : InFile = Param.Substring(2) Case "o:" : OutFile = Param.Substring(2) Case "l:" : LogFile = Param.Substring(2) Case "p:" : ImportFile = Param.Substring(2) Case "d:" : DeleteInFile = (Param.Substring(2).ToLower = "j" OrElse _ Param.Substring(2).ToLower = "y") End Select Else Throw New Exception("Ugyldig parameter: " & Param) End If Next
Try OutWriter = New StreamWriter(OutFile, False, System.Text.Encoding.UTF8) If LogFile <> "" Then LogWriter = New StreamWriter(LogFile, False, System.Text.Encoding.UTF8) End If Reader = New StreamReader(InFile) Users = New Hashtable
Do Until Reader.Peek = -1 ErrText = "" Line = Reader.ReadLine LineNumber += 1 If Line.IndexOf(","c) > -1 Then LineCount += 1 'Indlæs bruger og telefon User = Line.Substring(0, Line.IndexOf(","c)).Trim Phone = Line.Substring(Line.IndexOf(","c) + 1).Trim 'Undersøg, om bruger og telefon er angivet, samt om de er blevet 'behandlet før: If User = "" OrElse Phone = "" Then ErrText = String.Format("Bruger eller telefon ikke angivet.") ElseIf Users.ContainsKey(User) Then ErrText = String.Format("Bruger allerede indlæst: {1}", _ LineNumber, User) ElseIf Users.ContainsValue(Phone) Then ErrText = String.Format("Telefon allerede indlæst: {1}", _ LineNumber, Phone) Else 'Bruger og telefon er ikke set før. Skriv til out-fil. Users.Add(User, Phone) OutWriter.WriteLine("""{0}"" user {1} {2}", _ ImportFile, User, Phone) End If 'Skriv fejl til log og skærm: If ErrText <> "" Then If Not LogWriter Is Nothing Then LogWriter.WriteLine("Linie {0} - {1}", LineNumber, ErrText) End If Console.WriteLine("Linie {0} - {1}", LineNumber, ErrText) End If End If Loop Console.WriteLine("") Console.WriteLine("{0} af {1} linier indlæst.", Users.Count, LineCount)
'Slet input fil? If DeleteInFile Then Reader.Close() Reader = Nothing File.Delete(InFile) End If
Return 0 Catch ex As Exception Console.WriteLine("Der skete en fejl: " & ex.Message) If Not LogWriter Is Nothing Then LogWriter.WriteLine("FEJL: " & ex.Message) End If Return -1 Finally If Not OutWriter Is Nothing Then OutWriter.Close() If Not LogWriter Is Nothing Then LogWriter.Close() If Not Reader Is Nothing Then Reader.Close() End Try End Function End Class
Programmet kaldes herefter fx således:
"C:\Sti til program\program.exe" i:"c:\inputfil.csv" o:"c:\outputfil.bat" l:"c:\logfil.txt" p:"c:\import\import.exe" d:y
Du kan altså angive følgende parametre når du kalder programmet:
i:<sti til csv fil> o:<sti til outputfil> l:<sti til logfil> p:<sti til import.exe-filen> d:<slet csv fil - y/n eller j/n>
Parametrene kan skrives i en vilkårlig rækkefølge. Stien til log-filen kan undlades (så logges fejl ikke) og angivelse af, om csv-filen skal slettes, kan også undlades (som udgangspunkt slettes den IKKE).
Hej Mikbj Tak for dit svar, alt ser ud til at virke som det skal, dog blev jeg nødt til at ændre "System.Text.Encoding.UTF8" til "System.Text.Encoding.ASCII", da der bliver lagt nogle forkerte tegn ind i den første linie i "outputfil", hvis du kompilere en version med .UTF8, kan du efterfølgende åbne filen med edit, har kan du se disse tegn, disse tegn bevirker at filen ikke bliver kørt korrekt.
Men efter jeg ændret til .ASCII virker det som det skal :-)
Ok, det kommer også an på hvilken encoding din CSV fil er gemt med, da fejlen, som udgangspunkt, ikke dukkede op hos mig.
Men godt at høre det virker! :-) Tak for point.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.