2016-04-13 16 views
0

私はデータセットを持っていますが、という変数を1つだけ持つData1と呼びます。これからテキストファイルに各エントリを保存したいのですが、次のエントリに移動します。次のエントリがテキストファイルに書き込まれたら、前のエントリを上書きする必要があります。私はFILE文を使用していますが、なんらかの理由で古いエントリに新しいエントリを追加し続けます。私は、次のコードをしている:私はmyfile.txtの開いたときに、私はすべての観測のためのエントリがそれぞれのために、1行に保存されていることをFILE文を使用してファイルのテキストを上書きする

data _null_; 
    set Data1; 
    do i = _N_; 
    if i > 0 then do; 
     file "myfile.txt"; 
     put V1; 
    end; 
    end; 
run; 

参照してください。しかし、私が望むのは、最後のエントリだけを保存する必要があるということです(私は後でループに他のものを追加しますが、重要なのは古いコンテンツが上書きされるということです)。

"OLD"オプションをFILEステートメントに追加しようとしましたが、OLDがサポートされなくなったというメッセージが表示されます。私はSAS 9.4を使用しています。

ありがとうございます!

+1

'put V1;'を 'put @ 1 V1 @@;'に置き換えると、各データステップループの後にカーソル位置が保持され、次に列1に書き出しが再開されます。(V1は一定の長さ、技術的には、以前のV1の値が長い場合は、そのテキストの一部が残る) – mjsqu

+0

ありがとうございます! V1は実際には一定の長さではありません(私はあなたがV1の各エントリの文字数を意味していると仮定します)。つまり、最後のエントリがたとえば20文字で、前の値が30の場合、最後のエントリがファイルに書き込まれたときに、前のエントリの最後の10が残りますか? –

+0

はい、そうです。あなたは次のものを追加することができます: 'filler = repeat( ''、200); @ 1フィラーを入れる@@; put @ 1 V1 @@; 'これは空白で前のエントリをクリアします。おそらくこれを行う他の方法があるので、私は実際の答えよりもむしろコメントで回答します。 – mjsqu

答えて

1

正確に何をしようとしているのかを判断するのは難しいですが、可能な答えは_FILE_自動変数を使用することです。

data _null_; 
    set sashelp.class; 
    do i = 1 to _N_; 
    if i > 0 then do; 
     file "c:\temp\myfile.txt"; 
     _file_ = name; 
    end; 
    end; 
run; 

これは、_FILE_マジックとして知られる高度SAS技術です。これは_INFILE_ Magicに関連しており、よりよく知られているテクニックであり、inputで利用できる強力なスキャンツールを使用するなどの機能を備えたい場合には非常に役に立ちますが、それは10年前のことでしたが、入力でできることのほとんどはscanindexfindなどで利用できるようになりました。そのため、これを行うには、正確に何をしているかによって、_FILE_または_INFILE_のいずれかを使用することができます。あなたが同じファイルの読み取り/書き込みを許可するsharebuffersを使用しています_INFILE_バージョン:詳細を参照するには、トピックに関する論文のための

data _null_; 
    set sashelp.class; 
    do i = 1 to _N_; 
    if i > 0 then do; 
     infile "c:\temp\myfile.txt" sharebuffers; 
     file "c:\temp\myfile.txt"; 
     _infile_ = name; 
    end; 
    end; 
run; 

検索検索; Mike Zdebの_FILE_ Magic(NESUG 2012)、Peter CrawfordのMore _INFILE_ Magic(SUGI 28/2003)は、これらのツールの優れた例です。

+0

リンクが奇妙に見える場合は謝罪してください。残念ながら(コードフォーマットでリンク全体を作る以外の)変数の周りに_を得る他の方法はありません。 – Joe

+0

ありがとうジョー - これは動作します。それは前のエントリの長さに(私は推測して)いくらかの空白を追加しますが、これが得られるほど良いと思います! –

0

コメントで指定されているように、これは二重のトレーリング、およびポインタ位置でそれを行うための迅速かつ汚い方法です:

data _null_; 
set Data1; 
filler=repeat(' ',200); 
file "myfile.txt"; 
    put @1 filler @@; 
    put @1 V1 @@; 
run; 

追加:

  • フィラー変数が200を保持
  • 最初のputステートメントは、ファイル内の最初の行に空白を書き込み、末尾のdoubleは現在の行にポインタを保持します
  • putステートメントは...空白
  • データステップが再びループ、第putが最初の行に空白文字を書き込むの一部を上書きする、最初の列で

等をV1の値を書き込みます。

は削除:

  • は、ループを実行し、私は彼らが必要としているかはわからない、または新しい行に達するたびに、ファイルを再作成するだけで試みました。データ・ステップは、デフォルトでは1から入力の末尾まで_N_をループします。
+0

ありがとう!私はDO部分を削除し、それは動作します! –

関連する問題