セル内改行をもつCSVファイルの読み込み

Last-modified: 2010-04-29 (木) 22:39:41

エクセルでは,セル内改行を行うと,改行コードとして制御記号の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行目
 */