Det der driller mig er kommaet i farvefelt-tekststrengen. Derfor kan jeg ikke umiddelbart bruge split(str,",") funtionen. Desuden er der "(tommer) angivelsen. Den driller også en smule.
Er der nogle, der har et rigtig godt forslag til, hvordan man kan få trukket værdierne ud? Der vel egentlig sådan indholdet skal være, når værdierne er trukket ud af filen:
do while not file.AtEndOfStream 'Læs en linje i filen str = file.readline
'Find føste og andet komma fk_pos = inStr(1,str,",") ak_pos = inStr(fk_pos+1,str,",") 'Er karakteren efter andet komma et tal så split ' eller er der mere tekst efter det komma if isNumeric(mid(str,ak_pos+1,1)) then strArr = Split(str, ",") else Set strArr = Nothing redim strArr(0) strArr(0) = mid(str,1,fk_pos-1) redim preserve strArr(ubound(strArr)+1) ak_pos = inStr(ak_pos+1,str,",") strArr(1) = mid(str,fk_pos+1,ak_pos-fk_pos-1) str = mid(str,ak_pos+1) tempArr = Split(str,",") for i = lbound(tempArr) to ubound(tempArr) redim preserve strArr(ubound(strArr)+1) strArr(ubound(strArr)) = tempArr(i) next end if
'Test udskrift for i = lbound(strArr) to ubound(strArr) Response.Write strArr(i) & " " next Response.Write "<br>"
loop file.Close Set file = Nothing Set FSO = Nothing
'Fjerner " og " fra start og slut for i = lbound(strArr) to ubound(strArr) if Left(strArr(i),1)="""" AND Right(strArr(i),1)="""" then strArr(i) = Mid(strArr(i),2,len(strArr(i))-2) end if next
Så det bliver:
do while not file.AtEndOfStream str = file.readline
fk_pos = inStr(1,str,",") ak_pos = inStr(fk_pos+1,str,",") if isNumeric(mid(str,ak_pos+1,1)) then strArr = Split(str, ",") else Set strArr = Nothing redim strArr(0) strArr(0) = mid(str,1,fk_pos-1) redim preserve strArr(ubound(strArr)+1) ak_pos = inStr(ak_pos+1,str,",") strArr(1) = mid(str,fk_pos+1,ak_pos-fk_pos-1) str = mid(str,ak_pos+1) tempArr = Split(str,",") for i = lbound(tempArr) to ubound(tempArr) redim preserve strArr(ubound(strArr)+1) strArr(ubound(strArr)) = tempArr(i) next end if 'Fjerner " og " fra start og slut for i = lbound(strArr) to ubound(strArr) if Left(strArr(i),1)="""" AND Right(strArr(i),1)="""" then strArr(i) = Mid(strArr(i),2,len(strArr(i))-2) end if next
'Test udskrift for i = lbound(strArr) to ubound(strArr) Response.Write strArr(i) & " " next Response.Write "<br>"
Det er fordi der er et tal 4 lige efter kommaet. Så det ikke længere nok med at tolke et tal som værne OK lige efter kommaet.
så kan man lave det om så den skal kigge efter ,TALTAL, for at man ved tallet ikke er en del af teksten mellem " og ". Men det holder sikkert heller ikke i længden da det nok vil opstå før eller siden: "G.TEE,45,67GR.GREN"
Kan man ikke lave noget kode, som tjekkede om der var kommaer inden for "" og så replace disse kommaer med et andet tegn! Efter følgende ville en split(str,",") jo fungere!
Nej det er bare en måde man kan skrive en " i en streng. Hvis man vil skrive Hej "gamle" dreng i en tekst streng så skriver men to "" efter hinandn i stengen: str = "Hej ""gamgle"" dreng"
Alternativ kan der være , efter et (tomme) tegn? Eller så må det regexp du fik den anden da laves om så den ikke kun søger efter " men ",TALTAL," som slut på strengen...
Det samme nu laver den det komma om til mølle, og den søger efter
",TALTAL," som slut på strengen som må indehold komma.
Function SplitStr(str) Dim re, strTmp Set re = New RegExp re.Pattern = "(""[\w\d\s]+),([\w\d\s]+"",[\d.]+,"")" re.Global = true strTmp = re.Replace(str, "$1¤$2") SplitStr = Split(strTmp,",") End Function
Function SplitStr(str) Dim re, strTmp Set re = New RegExp re.Pattern = "(""[\w\d\s]+),([\w\d\s]+"",[\d.]+,"")" re.Global = true strTmp = re.Replace(str, "$1¤$2") SplitStr = Split(strTmp,",") End Function
Set FSO = Server.CreateObject("Scripting.FileSystemObject") Set file = FSO.OpenTextFile(Server.MapPath("xxx"))
do while not file.AtEndOfStream str = file.readline
'den splittes med den nye funktion strArr = SplitStr(str)
' hvert element i arrayet udskrives - men først udskiftes møllehjul igen med komma For i = lbound(strArr) to ubound(strArr) strArr(i) = Replace(strArr(i),"¤",",") if Left(strArr(i),1)="""" AND Right(strArr(i),1)="""" then strArr(i) = Mid(strArr(i),2,len(strArr(i))-2) end if Next
'Test udskrift for i = lbound(strArr) to ubound(strArr) Response.Write strArr(i) & "<br> " next Response.Write "<br>"
du skrev --------------- Nej det er bare en måde man kan skrive en " i en streng. Hvis man vil skrive Hej "gamle" dreng i en tekst streng så skriver men to "" efter hinandn i stengen: str = "Hej ""gamgle"" dreng"
men der er kun en " i strengen. ------------- Der er faktisk 2 " i strengen. Se her:
Ja, undskyld jeg blander mig med noget irrelevant, men dette minder mig lidt om en diskussion at bruge det rigtige værktøj. I mine øjne er det regulære udtryk, og så også Perl (der er regulære udtryk andre steder).
Jeg fandt et gammelt script, jeg har brugt før. tilpassede en linie, og satte separator-tegnet mellem felterne til semikolon. Scriptet er:
$s='"(?:[^"]|"")*"'; $d='\d+(?:\.\d+)?'; while (<>) { /^($s),($s),($d),($s),($d),($s)$/ or die("FEJL: $_\n"); @a=($1,$2,$3,$4,$5,$6); for (@a) { s/""/"/g; s/^"(.*)"$/\1/; } print join(';',@a)."\n"; }
Nej :) Men ASP har også regulære udtryk i dag - jeg gider bare ikke sætte mig ind i hvordan man gør. Men som sagt - jeg kan køre din fil igennem scriptet.
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.