2012-04-13 3 views
0

私はカラム幅が固定されているローデータを扱っていますが、すべてのレコードが1行に書き込まれています。 INPUTステートメントで 固定列幅を使用する方法と、@@を使用して1行に複数の観測値を読み取る方法を知っていますが、両方を実行しようとすると問題が発生します。SAS DATAのステップ/ INPUTステートメント:列ベースの生データと複数の観測値を1行から読み込みますか?

例として、データの列幅は固定されていますが、レコードごとに1行のコードがあります。このコードは正常に動作します:

DATA test_1; 
    INPUT alpha $ 1-5 beta $ 6-10 gamma 11-15 ; 

    DATALINES; 
a f 1 
ab fg 12 
abc fgh 123 
abcd fghi 1234 
abcdefghij12345 
    ; 
RUN; 

は今ここに、私が本当にやろうとしている何のためのコードです - すべてのデータが1行である、と私は@@表記を使用しよう:

DATA test_2; 
    INPUT alpha $ 1-5 beta $ 6-10 gamma 11-15 @@; 

    DATALINES; 
a f 1 ab fg 12 abc fgh 123 abcd fghi 1234 abcdefghij12345 
    ; 
RUN; 

これは、最初の15文字を読み込み、そのレコードを保持し、先頭から読み直し続けるだけで失敗します。 @@表記法の意味についての私の理解に基づいて、なぜこれが起こっているのか、私は間違いなく理解することができます。

固定列データを1行で読み取る方法はありますか。つまり、test_2の内容はtest_1と同じですか?おそらく、INPUTステートメントのシンボルのいくつかの組み合わせによって、または別の方法(ファイルI/OファンクションPROC IMPORTなど)に頼っているかもしれませんか?

答えて

2

インフォーメーションを使用して可変長を指定しようとしましたか?例えば

DATA test_2; 
    INPUT alpha $5. beta $5. gamma 5.0 @@; 

    DATALINES; 
a f 1 ab fg 12 abc fgh 123 abcd fghi 1234 abcdefghij12345 
; 
RUN; 

SASのドキュメントから:

書式入力がポインタ変数の値を読み取るために、列入力 のそのよう移動させます。ポインタは、informatで指定された の長さを移動し、次の列で停止します。

+1

いいえ...私は別に何をしていたのか分かりませんでしたが、テストしてサンプルデータで動作します –

+0

うわー、私はさまざまな幅の列を扱い、 ':'表記':'を削除して幅を指定するだけで、絶対幅を指定するのを忘れてしまったのです。私は今、この回答を受け入れていますが、私はあなたにも教えてくれることを望んでいました。人々はなぜ「アルファ$ 5」と言うことができるのでしょうか?前の表記法はある種の遺産支援ですか?とにかく、偉大な答えをありがとう。 –

+1

アルファ$ 1-5とアルファ$ 5は別物です。最初の行は、現在の入力行の列1-5から読み取ります(これが元の問題の根本的な原因です)。 2番目の文字は、現在の位置からNEXT 5文字を読み取ります。だから1つは別のものに取って代わるものではなく、彼らは相補的です。 –

関連する問題