webForumDet fria alternativet

läs in txtfil till 2 dimensionell array.

ASP

19 svar · 662 visningar · startad av T_Codez

Medlem sedan juli 2001458 inlägg
Frågan#1

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

Medlem sedan mars 2002777 inlägg
#2

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? ;)

Medlem sedan juli 2001458 inlägg
#3

*Fixat*

Thanks för korrigeringen och begreppslektionen :e

Medlem sedan mars 20002 836 inlägg
#4

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

Medlem sedan juli 2001458 inlägg
#5

Thankz! :e

Ska genast grotta ner mig i denna till dess att jag fårstår den till fullo... :-)

Medlem sedan juli 2001458 inlägg
#6

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å ;)

Medlem sedan juli 2001458 inlägg
#7

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?

Medlem sedan juli 2001458 inlägg
#8

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

Medlem sedan mars 20002 836 inlägg
#9

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

Medlem sedan mars 20002 836 inlägg
#10

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

Medlem sedan juli 2001458 inlägg
#11

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...

Medlem sedan juli 2001458 inlägg
#12

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

Medlem sedan juli 2001458 inlägg
#13

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.

Medlem sedan feb. 20022 594 inlägg
#14

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

Medlem sedan juli 2001458 inlägg
#15

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"

Medlem sedan mars 20002 836 inlägg
#16

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

Medlem sedan nov. 20017 144 inlägg
#17

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
Medlem sedan mars 20002 836 inlägg
#18

Hello!

gammal tråd
återkommer

cya,
PatrikB

Medlem sedan mars 20002 836 inlägg
#19

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

Medlem sedan nov. 20017 144 inlägg
#20

Kanoooon!

274 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)