1

次のようなblood.txtデータセットがあります(最初の5つのobs):

1    Female AB Young 7710   7.4  258
2    Male   AB Old   6560   4.7  .
3    Male   A  Young 5690   7.53 184
4    Male   B  Old   6680   6.85 .
5    Male   A  Young .      7.72 187

私はそれを読むために次のプログラムを使用しました:

data blood_sum;
infile "/path/blood.txt";
input @1 SubjID $
      @6 Gender $
      @13 BloodType $
      @16 AgeGrp $
      @22 RBC 
      @29 WBC
      @34 Cholesterol ;
run;

しかし、最後の列「コレステロール」は表示できません。すべての値は「.」に置き換えられます。私のログには、次のような多数の NOTE エラーがあります。

NOTE: Invalid data for Cholesterol in line 1 34-37.
 RULE:     ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0                      

 1   CHAR  1    Female AB Young 7710   7.4  258. 37
     ZONE  3222246666624425676623333222323223330
     NUMR  1000065D1C501209F5E7077100007E400258D
 SubjID=1 Gender=Female BloodType=AB AgeGrp=Young RBC=7710 WBC=7.4 Cholesterol=. _ERROR_=1 

誰でも助けることができますか?

4

2 に答える 2

2

UNIX システムでこれを実行していると思いますが、読んでいるファイル (blood.txt) は Windows システムで作成され、バイナリ モードでシステムにコピーされています。

ログを見ると、入力行 (37 列目) の最後の値の後に「ドット」があることに気付くはずです。ディスプレイの ZONE および NUMR 部分は、その位置の 16 進コード (この場合は「0D」) を明らかにします。これはキャリッジ リターン文字です。UNIX エディタ (vi など) でファイルを開くと、これらの文字^Mが各行の末尾に表示されます。

受け取った場所から新しいコピーをダウンロードするか (ファイルを TEXT モードで転送するようにしてください)、コピーを UNIX テキスト ファイルに変換することができます。dos2unix変換するには、次のようなコマンドを使用できます。

dos2unix /path/blood.txt /path/blood.txt

同じ名前を使用すると、元のファイルが上書きされることに注意してください。もちろん、許可をいただいていると思います。

何らかの理由でファイルを変換できない場合は、パイプを使用して変換できます。つまり、次の FILENAME ステートメントを使用し、ファイル名から読み取るように INFILE ステートメントを変更します。

filename mydata pipe "tr -d '\r' < /path/blood.txt";
data blood_sum;
   infile mydata truncover;
   input @1 SubjID $
         @6 Gender $
        @13 BloodType $
        @16 AgeGrp $
        @22 RBC 
        @29 WBC
        @34 Cholesterol ;
run;

truncover必要ないかもしれませんが、オプションを追加しました。興味がある場合は、ドキュメントで詳細をお読みください。

ところで、これは非常に一般的なエラーであり、誰にでも少なくとも 1 回は起こります。スタックオーバーフローへようこそ。

于 2013-02-16T19:48:39.727 に答える
0

この問題については、少し異なる解決策を示します。これは、ボブが行末のキャリッジ リターンによって引き起こされていることに同意します。

行の終了文字 (通常、Windows の場合は CR/LF または '0d'x '0a'x、Unix の場合は '0a'x または LF のみ) は、infile の TERMSTR オプションで制御できます。

http://support.sas.com/kb/14/178.html

data blood_sum;
   infile "/path/blood.txt" termstr=CRLF;
   input @1 SubjID $
         @6 Gender $
        @13 BloodType $
        @16 AgeGrp $
        @22 RBC 
        @29 WBC
        @34 Cholesterol ;
run;

ところで、あなたの入力方法は少しわかりにくいと思います。ここでは入力タイプを混在させているため、常に一貫した結果が得られるとは限りません。実際、フォーマットを明示的に割り当てていれば、おそらくこのようなことは起こらなかったでしょう!

input
@1 subjid $4.
@6 gender $6.
@13 bloodtype $2.
@16 agegrp $5.
@22 rbc best8.
@29 wbc best4.
@34 Cholesterol 3.
;

次に、コレセロールは 34 ~ 36 から読み取られ、SAS が変数に 37 を含めようとすることはありませんでした。

于 2013-02-17T02:33:22.420 に答える