Lite begreppsförvirring. ;)
Dimmad brukar man säga när man dimmar variabler, object mm. Ex:
dim ture, gote, kanin, vit
Jag misstänker att du menar en 2 dimensionell array? ;)
19 svar · 662 visningar · startad av T_Codez
Hej hej :-)
Nu har jag nästa lilla txt fil fundering.
Igår lärde jag mig av @nders hur man läser in varje rad från en textfil till en array på en gång.
Set fso = CreateObject("Scripting.FileSystemObject")
Set textfil3 = fso.OpenTextFile(server.mappath("./") & "\grannar.txt",1, False)
text = textfil3.ReadAll
arrRows = split(text, vbCrLf)
textfil3.close
Nästa steg är att jag även skulle vilja
ha en 2 dimensionerad array. Där raden får ett
värde.
typ: array(1), Precis som tidigare.
Och det nya är att varja rad har 4 värden
som är semikolon separerade i txtfilen typ:
Kalle;Anka;Ankborg;kalle.anka@ankeborg.com
Kajsa;Anka;Ankborg;kajsa.anka@ankeborg.com
och då ska raden få (flera) värden t ex:
array(1.1) = Kalle
array(1.2) = Anka
array(1.3) = Ankeborg
array(1.4) = kalle.anka@ankeborg.com
Kan man göra det på någe vänster...
Har testat ett gäng olika varienter på raden
arrRows = split(text, vbCrLf)
och lagt till: ";" i den på många olika sätt utan att lyckas.
Antar att jag kanske måste ha en ny split kanske...
Vet ni hur ?
Tack för uppmärksamheten
/T
Lite begreppsförvirring. ;)
Dimmad brukar man säga när man dimmar variabler, object mm. Ex:
dim ture, gote, kanin, vit
Jag misstänker att du menar en 2 dimensionell array? ;)
detta funkar helt ok:
<%
Option Explicit
Response.Buffer = True
Dim strFilePath
Dim strFileContent
Dim varMembers
Dim N
strFilePath = Server.MapPath("/arrays/members.txt")
strFileContent = GetFileContent(strFilePath)
varMembers = StringTo2DArray(strFileContent, vbcrlf, ";")
%>
<html>
<head>
<title>File to 2-dimensional array</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<%
If IsArray(varMembers) Then
For N = 0 TO UBound(varMembers,2)
Response.Write "<A href=""mailto:" & varMembers(3,N) & """>" & _
varMembers(0,N) & " " & varMembers(1,N) & "</A>, " & varMembers(2,N) & "<BR>"
Next
End If
%>
</body>
</html>
<%
'## -- hämta allt innehåll i en text-fil --
Function GetFileContent(sFilePath) ' As String
Dim objFSO, objFile
Dim strFileContent
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(sFilePath,1, false)
strFileContent = objFile.ReadAll
Set objFile = Nothing
Set objFSO = Nothing
GetFileContent = strFileContent
End Function
Function StringTo2DArray(sString, vFirstSplit, vSecondSplit)
Dim varTemp, varTemp2, var2DTemp
Dim I, N, intPos, intIndex
'## -- splita strängen för att få en array med all info --
varTemp = Split(sString, vFirstSplit)
If IsArray(varTemp) Then
intIndex = UBound(varTemp)
intPos = UBound(Split(varTemp(0), vSecondSplit))
ReDim var2DTemp(intPos, intIndex)
For I = 0 TO intIndex
'## -- splitta varje index för info-arrayn för att
'## kunna ta ut detaljerad information
varTemp2 = Split(varTemp(I), vSecondSplit)
'## -- spar detaljinfo till en 2-D Array --
For N = 0 TO intPos
var2DTemp(N,I) = varTemp2(N)
Next
Next
End If
'## -- returnera resultatet som en 2-D array --
StringTo2DArray = var2DTemp
End Function
%>
cya,
PatrikB
Hej igen
PatrikB - Koden du lämnade var helt okay (den kändes dock lite tung att sätta in sig i just nu). Den gav mig dock uppslag till följande ide som fungerar. men jag skulle behöva lite hjälp med att skapa ytterligare en dimension i den.
Så här ser det ut nu:
dim r, row, instream
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set InStream = FileObject.OpenTextFile (Server.Mappath ("textfil2.txt"),1, False)
do while not instream.atEndOfStream
row = instream.readline
items = split(row, ";")
helaraden = split(row, vbCrLf)
här skull jag vilja skapa en 2 dimensionell array som läser in värdena från helaraden(index) och items(index)
Typ att ArrayAll(helaraden(index).items(index))
Jag är tyvärr inte så haj på flerdimensionerade arrayer
men det borde gå. Eller hur?
loop
inStream.close
Vad tror ni om det? Har ni några ideer?
Ska givetvis söka på forumet också ;)
Någonting sånt här kanske:
c = 0
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set InStream = FileObject.OpenTextFile (Server.Mappath ("textfil2.txt"),1, False)
do while not instream.atEndOfStream
c2 = 0
row = instream.readline
items = split(row, ";")
helaraden = split(row, vbCrLf)
arrayall(c,c2) = helaraden(c) 'Rad 74
Do while c2 \<\> 4
arrayall(c,c2) = items(c2)
c2 = c2 + 1
loop
c = c + 1
loop
inStream.close
Detta ger dock ett felmeddelande som säger:
Error Type:
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'arrayall'
/tt.asp, line 74
Lite osäker på initieringen av en array med fler dimensioner. Det är nog det som är den mest yrsliga just nu.
Har glidit runt en del nu men inte blivit så mycket klokare av det...
Någon därute som vet?
Okay... Har nu kommit lite längre... (tror jag)
Har efter en del trillande fram till följande:
dim r, row, instream, helaraden, c, c2, ArrAll(0,0)
c = 0
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
Set InStream = FileObject.OpenTextFile (Server.Mappath ("textfil2.txt"),1, False)
'row = instream.ReadLine
'items = split(row, vbCrLf)
do while not instream.atEndOfStream
c2 = 0
' räknar rader...
row = instream.readline
items = split(row, ";")
helaraden = split(row, vbCrLf)
Ubound(ArrAll,1) = c (rad 73)
Do while c2 \<\> 4
Ubound(ArrAll,2) = items(c2)
c2 = c2 + 1
Redim ArrAll(c,c2)
loop
c = c + 1
Redim ArrAll(c,c2)
loop
inStream.close
Det behövdes några redim etc.
Men jag får fortfarande ett felmess som säger:
Error Type:
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'Ubound'
/tt.asp, line 73
Har inte en susning vad det kan bero på...
Misstänker att det kan kanske ha någe med initieringen att göra kanske... Den som lever får se...
Anyone :q
ehhh, gick den koden som jag visade långsamt?
Den som du använder och läser rad för rad går ca 6 ggr långsammare.
Med koden jag gav lästa jag in ca 20 000 rader in i en 2D array på ca 500 ms (460 - 520 ms) den varianten att läsa rad för rad tog ca 3000ms dvs 3 sek ( 2880 - 3250 ms)
cya,
PatrikB
till din fråga på om rad 73:
UBound är en metod som returnerar ett värde. dvs, du kan inte "skriva" till UBound() eftersom det inte är en egenskap
cya,
PatrikB
Naaeeejj... alltså...
det var mer att jag ville åstakomma något som jag kunde förstå lättare... Eller nåt sånt... samt, och, eller kanske typ...
Plus att jag är nyfiken på om det går att lägga in två 1 dimensionella i en 2-dimensionell array samt hur det
går till etc...
Man måste ju testa sig fram lite... :OO
vägen till total kod förståelse är en lång och krokig väg...
Då är frågan hur själva värde tilldelningen till en array går till?
Hur ser en vanlig syntax för det ut?
Kanske dags att skaffa en bokluring snart för min del... Så ni slipper såna här Basic frågor (i guess).
Har letat mig runt men inte hittat något (för mig) glasklart. Jag var på "Vides" sida och kollade och den var kanon. Men ändock ingen info.(som jag kunde hitta) om själva tilldelningen av värden till elementen i en 2 - dimensionell array.
well...
C ya
Lånade en bok med Lite info om Textstreaming...
"kanske kan komma till användning någon gång"
**TEXTSTREAM OBEKTETS EGENSKAPER
-----------------------------------------------
Egenskap Beskrivning
------------- --------------**
AtEndOfLine Returnerar True om filpekarna är vid slutet på en rad i filen.
AtEndOfStream Returnerar True om filpekaren är i slutet av filen.
Column Returnerar kolumnnumret för aktuella tecken i filen.
Line Returnerar aktuellt radnummer i filen
Egenskaperna AtEndOfLine och AtEndOfStream är bara tillgängliga för en fil som har öppnats
för "iomode" ForReading. Om du testar annat blir det bara error mess.
**TEXTSTREAM OBEKTETS METODER
---------------------------------------
Metod Beskrivning
-------- ---------------**
Close() Stänger öppen fil.
Read(numchar) Läser numchar antal tecken från filen.
ReadAll() Läser hela filen som en enda sträng.
ReadLine() Läser en rad(fram till en radmatning)från filen som en sträng.
Skip(numchar) Hoppar över och ignorerar numchars antal tecken vid läsning från filen.
SkipLine() Hoppar över och ignorerar nästa rad vid läsning från filen.
Write(string) Skriver string till filen.
WriteLine() Skriver string(valfri)och ett radmatningstecken till filen.
WriteBlankLines(n) Skriver n radmatningstacken till filen.
Härmed utnämer jag T_Codez till den oövervinnerlige mästaren när det gäller att skriva flera inlägg på rad. :) :birp
Själv är bäste dräng ;) Eller!?
Well... inte alla ggr kanske :r
Men du måste medge att det är inte så fel nästa gång någon vill ha lite fakta om Textstreams...
Jag kommer vara en av dem t ex. Sitter på en publik plats och skriver av en bokluring... av det jag tror mig behöva imorgon etc.
Jag ska banne mig bena ut detta och lite till. Nästa steg blir
arrayerna.
Bra förresten! :e
Den ska ju med...
ArrAll(c,c2) = c
Do while c2 <> 4
ArrAll(c,c2) = items(c2)
c2 = c2 + 1
Redim ArrAll(c,c2)
loop
c = c + 1
Redim ArrAll(c,c2)
Näruu... Ekström. Nu tar jag mig en sista "lill-lördag"
:birp
"Hepå're"
Härmed utnämer jag T_Codez till den oövervinnerlige mästaren när det gäller att skriva flera inlägg på rad
he, he ... att prata mid sig själv är alltid bäst ..... man får de svar man vill ha :e
cya,
PatrikB
PatrikB: Jag får "Subscript out of range: 'N' "
http://www.webforum.nu/showthread.php?s=&postid=389852#post389852
Textfilen ser ut så här:
Jesper;Thorn;08-557 849 35;jesper@thorn.as
Olle;Johnsson; 08-545 21 55;jesper@thorn.as
Kalle;Anka;Ankborg;kalle.anka@ankeborg.com
Kajsa;Anka;Ankborg;kajsa.anka@ankeborg.com
ok, tillbaka .....
La till lite felhantering/koll att vi har det vi ska ha ;)
Function StringTo2DArray(sString, vFirstSplit, vSecondSplit)
Dim varTemp, varTemp2, var2DTemp
Dim I, N, intPos, intIndex
'## -- splita strängen för att få en array med all info --
varTemp = Split(sString, vFirstSplit)
If IsArray(varTemp) Then
intIndex = UBound(varTemp)
intPos = UBound(Split(varTemp(0), vSecondSplit))
ReDim var2DTemp(intPos, intIndex)
For I = 0 TO intIndex
'## -- splitta varje index för info-arrayn för att
'## kunna ta ut detaljerad information
varTemp2 = Split(varTemp(I), vSecondSplit)
'## -- kontrollera att vi har en array --
If UBound(varTemp2) > -1 Then
'## -- spar detaljinfo till en 2-D Array --
For N = 0 TO intPos
var2DTemp(N,I) = varTemp2(N)
Next
End If
Next
End If
'## -- returnera resultatet som en 2-D array --
StringTo2DArray = var2DTemp
End Function
En sak som slår mig när jag ser din text-fil är att du är inkonsekvent i vilka positioner värdena återfinns.
I 3:e positionen på rad 1 och 2 innehåller telenummer medans i rad 3 o 4 innehålls den positionen av stad.
en mall att jobba med är:
förnamn;efternamn;stad;telenr;mail
Om inget värde finns ska ska positionen bli tom eller ett defaultvärde skrivas in, typ -
ex:
Patrik;Berggren;Fiholm;-;info (AT) mrwize (DOT) nu
cya,
PatrikB
Kanoooon!