User Tips: Reading a File into an Array
This tip comes from Rafeeq
I was in search of an array function like the one below for ASP (being so lazy!),
but I couldn't find one... so I decided to create my own!
This function reads a file line by line and stores each line a dynamic array. First two
object varibles - fso (file system object)
and ts (textfileobject) - are created.
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(filename, ForReading)
|
Then I declared an array using ReDim statement with the size set one.
Now as long as I read from the file, I change the size
of the array dynamically without destroying the previous elements and copy the current line
read to the current array element.
While not ts.AtEndOfStream
i=i+1
Redim Preserve myarray(i)
myarray(i)=ts.ReadLine
Wend
|
The final statement returns the myarray object from function File(filename).
Here's the entire source code listing:
<%
' //////////////////////////////////////////////////////////////////
' //
' // This function is a replica of PHP's "array file(filename)"
' //
' // Author Rafeeq C E email:rafeeqce@myiris.com
' // Wrote on 14-10-2000 during ---- Project
' //
' // Example: myarray=file("c:\mysongs.list")
' //
' //////////////////////////////////////////////////////////////////
Function File(filename)
Dim fso,ts, myarray
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile(filename, ForReading)
reDim myarray(0)
i=-1
While not ts.AtEndOfStream
i=i+1
Redim Preserve myarray(i)
myarray(i)=ts.ReadLine
Wend
ts.Close
File=myarray
End Function
%>
|
Cool Na! If you've trouble using this code (not for commercial purpose) feel free
to drop a line at rafeeqce@myiris.com!
(For more information on using the FileSystemObject, see the following FAQ: What is the FileSystemObject? For more information on resizing arrays, be sure to visit the FAQ: How can I dynamically resize an array?)
Comment from Bill Wilkinson
For large text files the above script is going to have horrible performance, doing the
ReDim Preserve on every line!
*SO* much better to do:
<%
..
ReDim ar(1000)
Count = -1
..
Do Until...
Count = Count + 1
If Count > UBound(ar) Then ReDim Preserve ar(Count+1000)
ar(Count) = theFile.readLine
Loop
' optional, if you want array exactly right size
ReDim Preserve ar(Count)
%>
|
But ReDim Preserve on each line???
Each empty element of an array only eats up 16 bytes of memory, so if the file turned out
to have only 1 line, we are only wasting 16,000 bytes of memory. And even then we only
waste it long enough to run through the loop. We only have to do a ReDim Preserve --
which is a VERY expensive operation in terms of time it takes and memory it
uses! -- once every 1,000 lines (plus once more at the very end). If you had 1,300 lines in
your file, you just save 1,298 ReDim Preserve calls! A huge performance
advantage!
Thanks for the comment, Bill! :-)
Happy Programming!