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

Shockley --

I will probably use it after I write some code to strip the Y-values before
the import, to save perhaps more time.

Larry
"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






---
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/29/2004