When you think ASP, think...
Recent Articles
All Articles
ASP.NET Articles
ASPFAQs.com
Message Board
Related Web Technologies
User Tips!
Coding Tips

Sections:
Sample Chapters
Commonly Asked Message Board Questions
JavaScript Tutorials
MSDN Communities Hub
Official Docs
Security
Stump the SQL Guru!
XML Info
Information:
Feedback
Author an Article
Technology Jobs
ASP ASP.NET ASP FAQs Message Board Feedback ASP Jobs
Print this page.
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.

reDim myarray(0)

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!

Return to user tips...



ASP.NET [1.x] [2.0] | ASPMessageboard.com | ASPFAQs.com | Advertise | Feedback | Author an Article