2017-04-07 63 views
0

實現以下代碼時,我發現了一個奇怪的輸出。SAS列輸入

data ex; 
    input a $ 1-80 b $; 
    datalines; 
1 2 
3 4 
5 6 

數據集EX是:

a  b 
1 2  3 

然後

data ex2; 
    input a $ 1-81 b $; 
    datalines; 
1 2 
3 4 
5 6 

數據集EX2是:

a  b 
3 4  5 

最後,我創建一個包含一個txt文件:

1 2 
3 4 
5 6 

和運行

data ex3; 
    infile '/.../test.txt'; 
    input a $ 1-10 b $ ; 

數據集EX3是:

a  b 
3 4  5 

誰能解釋如何緩衝和PDV工作得到怪異的結果?非常感謝。

所有結果均基於SAS Studio(大學版)。

回答

0

我得到這個

Obs  a  b 

    1  1 2 3 

與此日誌

27   data ex; 
28    input a $ 1-10 b $; 
29    datalines; 

NOTE: LOST CARD. 
RULE:  ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0      
33   ;;;; 
a=5 6 b= _ERROR_=1 _N_=2 
NOTE: SAS went to a new line when INPUT statement reached past the end of a line. 
NOTE: The data set WORK.EX has 1 observations and 2 variables. 

你說的是整個故事?

+0

對不起,讓你困惑。我現在糾正這個問題。下一次,我會在發佈之前仔細檢查。 –

0

當您從數據線(卡)讀取數據時,SAS會將​​線寬大小舍入爲80的倍數。從單獨的文件讀取時,不會執行此操作。

所以在這個例子:

data ex; 
    input a $ 1-80 b $; 
cards; 
1 2 
3 4 
5 6 
; 

您閱讀完整的80列卡圖像分爲A,那麼當您嘗試查看B它需要去下一行,因此它讀取,直到從第一空間第2行。因此,a='1 2'b='3'。然後,當它試圖讀取下一個觀察結果時,它將行讀入A中,並且用完信息以讀入B,從而當它讀取超過輸入末尾並且沒有寫入第二個觀測值時停止。

在第二個示例中,您嘗試讀取比A更多的全部內容,因此SAS進入新行並閱讀'3 4'。不知道爲什麼它不會嘗試從該行讀取超過80個,但看起來沒有。那麼當它想要讀取B時,它會從最後一行獲得5

你最後的例子就像第二個例子。您的外部文件在第一行中可能只有5個字符。因此,當您嘗試讀取10個字符時,它跳到下一行讀取A,然後必須到最後一行找到要讀取的內容B.

如果您希望它只從一行讀取數據的「流動」到下一行搜索數據,然後將TRUNCOVER選項添加到您的INFILE語句中。從卡片圖像讀取時,可以使用INFILE卡或INFILE DATALINES。