Avatar billede andersasp Nybegynder
09. juli 2010 - 10:41 Der er 7 kommentarer og
1 løsning

Replace af ; i CSV fil

Hejsa,

Jeg har et script som looper igennem et CSV dokument. dette gør den med ";" som separator.. Dette virker også helt fint, MEN..

Jeg har nu en linie hvor der er en postering som står således:

post1, post2, post3, post4
post1, post2, post3, post4
post1, post2, "post; 3"; post4  <- går i ged her

og her går mit script så i ged, da den tror at det ; i post3 er en ekstra celle...

Hvordan får jeg erstattet alle ; som har "" udenom sig til noget andet??

På forhånd tak!
Avatar billede Slettet bruger
09. juli 2010 - 11:43 #1
Et forslag (utestet):

<%
Dim quote1, quote2, semikolon
quote2=1

DO
  quote1 = InStr(quote2,text,"""")
    IF quote1 = Null THEN
      EXIT DO
    END IF

  quote2 = InStr(quote1,text,"""")

  semikolon = InStr(quote1,text,";")

  IF semikolon <> Null AND semikolon < quote2 THEN
    Replace(text,";","Noget andet",quote1)
  END IF
LOOP
%>
Avatar billede andersasp Nybegynder
09. juli 2010 - 11:51 #2
Tak for forslaget,

Hvis min streng hedder "Line" hvorledes sætter jeg den så ind i din funktion ?

Line = "post1, post2, "post; 3"; post"

På forhånd tak

Anders
Avatar billede andersasp Nybegynder
09. juli 2010 - 11:53 #3
Den melder fejl her:

Cannot use parentheses when calling a Sub
Replace(Line,";","",quote1)
Avatar billede Slettet bruger
09. juli 2010 - 11:57 #4
Korrektion:
Scriptet kan kun bruges, såfremt der højst kan forekomme én ; indenfor anførselstegnene. For at finde frem til samtlige ; kan det følgende formentlig bruges (stadig utestet) - jeg har indsat line som din tekststreng:

<%
Dim quote1, quote2, semikolon
quote2=1

DO
  quote1 = InStr(quote2,line,"""")
    IF quote1 = Null THEN
      EXIT DO
    END IF

  quote2 = InStr(quote1,line,"""")

  semikolon = InStr(quote1,line,";")

  DO WHILE semikolon <> Null AND semikolon < quote2
    Replace(line,";","Noget andet",quote1)
    semikolon = InStr(semikolon,line,";")
  LOOP

LOOP
%>
Avatar billede andersasp Nybegynder
09. juli 2010 - 13:05 #5
uhmm, den melder stadig fejl ved:

Cannot use parentheses when calling a Sub
Replace(Line,";","",quote1)

Det er langt fra alle liner som har denne hændelse, kan man lave det således at den ikke melder fejl ved dem som ikke har?

MvH

Anders!
Avatar billede supertekst Ekspert
09. juli 2010 - 15:38 #6
Rækken post1, post2, "post; 3"; post4

skal den redigeres som de øvrige?
således at ""'er fjernes og ; --> ,

VBA skulle nok kunne fikse dette problem ved gennemlæsning af filen.

Du er velkommen til at sende et repræsentativt uddrag - @-adresse under profil.
Avatar billede supertekst Ekspert
09. juli 2010 - 17:28 #7
Et bud:

Rem VBA-kode anbringes under ark i Excel-fil

Const redigeretFilSti = "C:\Documents and Settings\pb.KHNBPB\Skrivebord\CSV\"  'justeres
Const redigeretFilNavn = "redigeretFil.csv"                                    'justeres

Dim filId As String, linje As String, redLinje As String
Dim ræk As Long, r As String
Private Sub worksheet_activate()
    filId = Application.GetOpenFilename
   
    ræk = 1
    Open filId For Input As #1
    Open filredigeretfilsti + redigeretFilNavn For Output As #2
   
    While Not EOF(1)
        Input #1, linje
        redLinje = redigerLinjen(linje)
        r = ræk
       
Rem evt. test i regneark
'        Range("A" & r) = redLinje
'        ræk = ræk + 1
       
        Print #2, redLinje
    Wend
    Close #1
    Close #2
    Columns.AutoFit
End Sub
Private Function redigerLinjen(linje)
Dim f As Integer, tegn As String, p1 As Byte, p2 As Byte
Dim redLinje As String
    redLinje = ""
    For f = 1 To Len(linje)
        tegn = Mid(linje, f, 1)
        If tegn = Chr(34) Then
            If p1 = 0 Then
                p1 = f
            Else
                p1 = 0
            End If
        Else
            If p1 > 0 Then
                If tegn <> ";" Then
                    redLinje = redLinje + tegn
                End If
            Else
                If tegn = ";" Then
                    tegn = ","
                End If
                redLinje = redLinje + tegn
            End If
        End If
    Next f
    redigerLinjen = redLinje
End Function
Avatar billede Slettet bruger
09. juli 2010 - 19:14 #8
Okay, her er det færdigtkorrigerede forslag (denne gang testet og virkende).

Din tekst-streng skal hedde line.
Det fungerer således, at tekst-strengen splittes op i tre dele i løbet af søgningen:
- Én del, som består af indholdet mellem to apostroffer
- Én del, som indeholder al tekst før den første apostrof (dette er gennemarbejdet tekst)
- Én del, som indeholder al tekst efter den sidste apostrof (dette er endnu ikke-gennemarbejdet tekst)

Dermed kan der arbejdes isoleret med selve indholdet mellem apostrofferne.

Efter ét fund af et apostrof-sæt, sendes den af de tre dele, der indeholder ikke-gennemarbejdet tekst, endnu engang igennem script'et, og dermed findes der efterhånden frem til alle apostrof-sæt (jeg har her antaget, at apostroffer altid vil forekomme i sæt á to).

Scriptet er sat til at fjerne de pågældende semikolon-tegn.


<%
Dim quote1, quote2, textfirst, textrest, textpart, lenght

textrest = line                            'Teksten føres ind i script'et

DO
    lenght = len(textfirst & textpart)    'Antal karakterer frem til dér, hvor script'et arbejder lige nu
   
    quote1 = InStr(textrest,"""")        'Placering af " (start-")
    IF quote1 = 0 THEN                    'Afslut script, hvis intet " findes
        EXIT DO
    END IF   

    quote2 = InStr(quote1+1,textrest,"""")    'Placering af næst kommende " (slut-")
   
        textpart = mid(textrest,quote1+1,quote2-quote1-1)    'Teksten mellem de to " kaldes textpart

    textrest = mid(textrest,quote2+1)    'Resterende ikke-gennemsøgt tekst kaldes textrest

        textpart = replace(textpart,";","") & """"    'Udskift alle ; i textpart
        textfirst = mid(line,1,quote1+lenght)        'Al tekst frem til textpart kaldes textfirst
       
    line = textfirst & textpart & textrest        'De tre tekstudsnit sættes sammen igen

LOOP
%>
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