Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Append multiple files from .txt file with "file read"
From
David Kantor <[email protected]>
To
[email protected]
Subject
Re: st: Append multiple files from .txt file with "file read"
Date
Thu, 05 Dec 2013 19:49:52 -0500
Hello Nicole,
You may want to display `line' to see what you are getting.
Put in...
disp "`line'"
just before
use `line'
How many words does it comprise?
You could be failing because there is nothing there, or because there
are multiple words.
If there are multiple words, and the file name is all of `line'
(there are embedded spaces), then you need quotation marks:
use "`line' "
If there are embedded quotation marks, then use compound quotation marks
use `"`line' "'
-- and that is the safest way, in general.
But if only the first word is the desired filename, then you need to
select that:
use "`=word("`line'",1)'"
(Compound quotes may be safer:
use `"`=word(`"`line'"',1)'"'
)
Possibly this is an important consideration; you construct the file
using -! ls-. Does that write information other that the names?
(You are presumably on Unix; I don't recall exactly what you get from -ls-.)
If there are blank lines in the file, you may want a filter to skip them:
file open myfile using "filelist.txt", read
file read myfile line
while ~r(eof) & `"`line'"' == "" {
file read myfile line
}
if `"`line'"' ~= "" {
disp `"`line'"'
use `"`line'"'
file read myfile line
}
while ~r(eof) {
append using `"`line'"'
file read myfile line
}
I might write it a bit differently; this may be simpler:
local jj = 0
file open myfile using "filelist.txt", read
file read myfile line
while ~r(eof) {
if `"`line'"' ~= "" {
disp `"`line'"'
if ~`jj++' {
use `"`line'"'
}
else {
append using `"`line'"'
}
}
file read myfile line
}
That is, the -use- or -append- both appear inside the loop; -use-
occurs on the first pass, -append- on all subsequent passes.
Again, pay attention to what is in `line'; you may want only part of
it. The code above presumes you want all of `line' as the filename;
you will need to modify it if you need only part.
As for why your test loop displays the second but not the first line,
I cannot say. (I've heard of failing to get the final line, but you
don't seem to have that problem.)
Note that your first -save master_data- is unnecessary.
HTH
--David
At 06:30 PM 12/5/2013, you wrote:
Hello all,
First and foremost, I have yet to fully understand how to use macros,
so please forgive me if the solution to this problem is painfully
obvious. I actually hope it's painfully obvious.
I'm trying to combine multiple .dta files (1:1 horizontally appended)
by calling several .dta filenames stored in a .txt file. However, in
the process of doing this, whenever I try to run:
. use `line'
Stata returns the error:
. invalid file specification
Here's the code I'm trying to execute (sourced from here*). To start,
I'm trying to execute this code on a .txt file containing just two
lines (aka: two .dta filenames), but the final file will have 25
lines:
pwd
cd ~/Desktop/merge
! ls *.dta >filelist.txt
file open myfile using "filelist.txt", read
file read myfile line
use `line' /* ERROR HERE */
save master_data, replace
file read myfile line
while r(eof)==0 {
append using `line'
file read myfile line
}
file close myfile
save master_data, replace
I first thought the problem was that "filelist.txt" wasn't being read.
However, I believe it IS being read, since running the following:
! ls *.dta >filelist.txt
file open myfile using "filelist.txt", read
file read myfile line
while r(eof)==0 {
display "`=word("`line'",1)'"
file read myfile line
}
only displays the second (but not the first) line of the two-line .txt file.
Perhaps my issue has something to do with Stata overlooking the first
line of the .txt file? Or perhaps my general macro-incompetence (more
likely)?
Any help will be greatly appreciated. Thanks so much for your consideration.
Nicole
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/