Avatar billede zadus Nybegynder
20. januar 2006 - 11:07 Der 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
Avatar billede bernhof Nybegynder
21. januar 2006 - 21:05 #1
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?
Avatar billede zadus Nybegynder
23. januar 2006 - 09:28 #2
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.
Avatar billede bernhof Nybegynder
23. januar 2006 - 12:44 #3
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).

Håber det kan bruges.
Avatar billede zadus Nybegynder
24. januar 2006 - 11:11 #4
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 :-)

Tusinde tak for din hjælp.
Avatar billede zadus Nybegynder
24. januar 2006 - 11:12 #5
smider du lige et svar så jeg kan give dig nogle point.
Avatar billede zadus Nybegynder
24. januar 2006 - 11:13 #6
ok
Avatar billede bernhof Nybegynder
24. januar 2006 - 11:57 #7
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Politiets Efterretningstjeneste

Bliv AD-specialist hos PET

Udviklings- og Forenklingsstyrelsen

Data Engineers til bekæmpelse af skatteunddragelse

Danske Commodities A/S

IT Systems Engineer

Udviklings- og Forenklingsstyrelsen

Kontorchef med ansvar for tværgående service management