View Single Post
  #8   Report Post  
Posted to microsoft.public.excel.programming
shockley shockley is offline
external usenet poster
 
Posts: 135
Default import part of a text file

Oops! In the preceeding message, "Macro2" is the one that copies values
line by line and runs in 23 seconds. "Tester" opens the text file with Excel
and copies into another workbook and runs in 3 seconds.

Shockley



"shockley" wrote in message
...
Larry,

You're quite welcome. I'm naturally a bit curious if it helps you at

all--I
wasn't sure if it would run fast enough.

For a source file with 65534 x-values, my macro, on my machine runs 7
seconds.

To simply open the file with Excel and copy into another workbook, as with
this code:

Sub Macro2()
BeginTime = Now
Set fso = CreateObject("Scripting.FileSystemObject")
Set oSourceFile = fso.GetFile(SaveDir & "testSource.txt")
Set tsRead = oSourceFile.OpenAsTextStream(ForReading,
TristateUseDefault)

Do
sTest = tsRead.ReadLine
LineCount = LineCount + 1
Cells(LineCount, 1) = sTest
If tsRead.AtEndOfStream Then Exit Do
Loop Until LineCount = 65536

Runtime = (Now - BeginTime) * 86400
ThisWorkbook.Sheets(1).Cells(1, 5) = Runtime
End Sub

it takes 3 seconds. But this code has the line count limitation.

To read the text file line by line and place each x-value in Excel, as

with
this code:

Sub Tester()
BeginTime = Now
Workbooks.OpenText _
FileName:=SaveDir & "testWrite.txt", _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, _
Tab:=False, _
Semicolon:=False, _
Comma:=False, _
Space:=True, _
Other:=False, _
FieldInfo:=Array(Array(1, 1), _
Array(2, 1), Array(3, 1))

Set wbk = ActiveWorkbook
With wbk.Sheets(1)
Set rngEnd = .Cells(1, 1).End(xlDown)
If Not rngEnd Is Nothing Then
iRow = rngEnd.Row
Set rngSource = Range(.Cells(1, 1), .Cells(iRow, 1))
With ThisWorkbook.Sheets(1)
Set rngDest = Range(.Cells(1, 1), .Cells(iRow, 1))
End With
rngDest.Value = rngSource.Value
End If
End With
wbk.Close SaveChanges:=False
Runtime = (Now - BeginTime) * 86400
Cells(1, 5) = Runtime
End Sub

takes 23 seconds. So, my code is half as fast as the simplest,
line-count-limited method, but about 3 times as fast as the method you may
have tried.

Regards,
Shockley





"L Mehl" wrote in message
...
Shockley --

Thank you for the code. I appreciate all that effort.

Larry


"L Mehl" wrote in message
...
Another application creates text files which I import into a worksheet

for
further processing.

The text file looks like:
ARRAY 1 3023 <--3023 indicates how many X-values are in the file
#X-values, ...some more misc text ...
0.378228
0.737527
1.113739
1.488899
1.866231
2.257432
... more X-values
<--one space in this line
#Y-values
0.195559
0.152420
0.126161
0.199365
0.173638

... more Y-values

I need only the first 2 rows plus all the X-values (up to but not

including
the line containing one space.

There could be 65,500+ X-values, and line-by-line processing is slow

with
many values to import.

Is there a way in VBA to import a specified number of lines, without

using
a
line-by-line method?

expression.OpenText(...) has a StartRow parameter, but no "EndRow" as

far
as
I can tell.

Does anyone know of a text-file parsing program or a method which

could
be
used to write a program which could be called by VBA, to create a new

file
after stripping the rows below and including the line containing one

space?

Thanks for any help.

Larry Mehl




---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.600 / Virus Database: 381 - Release Date: 2/28/2004




---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.600 / Virus Database: 381 - Release Date: 2/28/2004