エクセルでは,セル内改行を行うと,改行コードとして制御記号のLF(ラインフィード"0A"x)を使います.
windowsのテキストファイルの改行コードは,CRLF(キャリッジリターン+ラインフィード"0D0A"x)で,これとは区別されるのですが,
SASは,LFもCRLFもともに改行として,読み込みを行おうとするため,セル内改行をもつCSVファイル
は,そのままでは,データセットに期待通りには読み込めません.
- シートのイメージ
┌───────┬───────┐ │セルA1の1行目 │セルB1の1行目 │ │セルA1の2行目 │セルB1の2行目 │ ├───────┼───────┤ │セルA2の1行目 │セルB2の1行目 │ │セルA2の2行目 │セルB2の2行目 │ └───────┴───────┘
- CSVファイルのイメージ(メモ帳でみるとこんな感じ.もちろん<LF><CRLF>は見えません)
"セルA1の1行目<LF>セルA1の2行目","セルB1の1行目<LF>セルB1の2行目"<CRLF> "セルA2の1行目<LF>セルA2の2行目","セルB2の1行目<LF>セルB2の2行目"<CRLF>
- SASの認識するイメージ(ワードパッドでみるとこんな感じ.SASも<LF>で,1行目が終わりと判断してしまう)
"セルA1の1行目 <LF> セルA1の2行目","セルB1の1行目 <LF> セルB1の2行目" <CRLF> "セルA2の1行目 <LF> セルA2の2行目","セルB2の1行目 <LF> セルB2の2行目" <CRLF>
ここでは,簡単な解決方法として,CRLFではない,単独に現れるLFをスペースに変換して,
それを,proc importで読み込むという方法を示します.
options nocenter;
data ;
infile "C:\input.csv" recfm=n;
file "C:\output.csv" recfm=n;
*length c $ 1.;
input c $char1.;
if lag(c) ne "0D"x and c="0A"x then c=" "; /*CRLFでない単独のLFをスペースにかえる*/
put c $char1.;
run;
proc import out= newdata
datafile = "c:\output.csv"
dbms=csv
replace;
getnames=no;
run;
proc print;run;
/*
OBS VAR1 VAR2
1 セルA1の1行目 セルA1の2行目 セルB1の1行目 セルB1の2行目
2 セルA2の1行目 セルA2の2行目 セルB2の1行目 セルB2の2行目
*/