2017-08-29 138 views
0

我的目標是獲得一個CSV文件的幾個數字列,所謂的氣溫,與其他分析走得更遠。不幸的是,最後一列是以文本類型獲得的我SAS文件中讀取輸入()函數可以將文本轉換爲數字格式,所以我試圖調用它,但它失敗的第5行,顯示日誌窗口:迭代通過SAS列的值 - 字符串操作

NOTE: Invalid argument to function INPUT at line 3278 column 10. 

我一起來到通過檢查該列中每個元素的十六進制代碼來修復它。正如我注意到的,只有最後一行(即成功的行)沒有CR字符(0D)。其他人拿到了。我發現壓縮函數對於範圍很有用,所以我在數據步驟中使用了它,但它並未刪除CR字符。 我告訴你我的代碼:

data work.meteo; 
    drop var7; 
    set work.meteo(rename=(var1=Prov var2=temp1 var3=temp2 var4=temp3 var5=temp4)); 
    x=compress(var6, '\r'); 
    format x $hex10.; 
    temp5 = input(x, 8.); 
run; 

和我的數據集: dataset_weather

我認爲壓縮無法列名可以使用,但我怎麼能遍歷列值正確調用它?有更好的方法來達到相同的目標嗎? 謝謝。

編輯問題喬的回答是: 是的,我嘗試了兩種方法來讀取CSV源文件;第一個包含一個Proc進口:

proc import datafile = 'path-file\...\meteo.csv' 
out= work.meteo 
dbms = CSV replace; 
getnames = no; 
run; 

第二個是infile和termstr。

data mydata; 
    infile "path-file\...\meteo.csv" 
    dsd termstr=crlf truncover; 
    input Prov $ temp1 temp2 temp3 temp4 temp5 ; 
run; 

在最後一個方法中,它導致temp5中沒有值的數據集(最後一行除外)。

回答

2

也許你的問題行最後有CR + CR + LF?或者你真正的行結束只是LF,只有前幾行有CR。

嘗試在讀取變量前從行中剝離所有CR。

data mydata; 
    infile "path-file\...\meteo.csv" termstr=LF dsd truncover ; 
    input @ ; 
    _infile_ = compress(_infile_,'0D'x); 
    input Prov $ temp1 temp2 temp3 temp4 temp5 ; 
run; 
+0

感謝@Tom,這是另一個有價值的解決方案:我在文檔中讀入了@在所謂的「自動變量」或緩衝區(如\ _infile \ _)內保留最後一條記錄的相同數據步驟。在這個\ _infile \ _中,你可以刪除所有變量的值CR字符。我是否正確? –

+1

本質上。 \ _INFILE_自動變量讓您訪問SAS用來存儲從輸入讀取的當前行的內部緩衝區。第一個INPUT上的尾部@告訴SAS你還沒有完成從這條線讀取。這是保持下一條INPUT語句不會嘗試讀取輸入中的下一行的原因。而是從寫入\ _INFILE_變量的行中讀取。 – Tom

1

我懷疑最終的答案就在您的CSV輸入:即,你也許可以修改你的輸入,因此回車顯示不出來。如果您提供的輸入,我們也許可以幫助那裏的一些信息(即,你怎麼導入此 - ?您使用PROC IMPORT我懷疑爲什麼在那裏的第一個五年行,但不是過去那種0D字符),這是可能的TERMSTRDLM可能可以在這裏幫助。

但是,既然你問這個問題:你不能用/r的方式這樣做 - 這並不是一個SAS有意義的事情。你需要compress(x,byte(13))compress(x,'0D'x),兩者都可以正常工作。

+0

感謝喬的解決方案。現在壓縮功能很好。我編輯了我的問題,給你更多關於我最後一個問題的細節。 –