Quantcast
Channel: ループタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 92

【SAS】CSVファイルの各行の文字列を一致検索条件として判定ループさせる

$
0
0

目次

  1. 前提
  2. 目的
  3. 方法
  4. 参考
  5. 所感

前提

  • 実行環境

    • Windows10
    • Base SAS 9.4
  • 必要な知識

    • SASコードの文法
      • DATAステップSETステートメントによるSDS作成
      • ATRRIBステートメントによる列定義
      • INFILEステートメントによる外部ファイル読み込み
      • SETステートメントのnobsオプションによる行数取得
      • SELECTステートメントによる条件分岐
      • index()による文字列検索
      • MACRO,MACRO変数の定義、呼び出し
      • %DO %TO %ENDによるループ

目的

次のようなPV(Page View)LogがSDS(SAS Data Set)で存在するとき、

pvlog.sas7bdat
IDurl
AAAhttps://abcde.news/category
AAAhttps://abcde.topics
BBBhttps://fghij/business/?cid=info
CCChttps://https://klmno.weather/Japan/Tokyo
DDDhttps://https://klmno.tenki/world
EEEhttps://https://pqrst/pollen?bid=forecast

次のような表形式のcsvファイルを用いて、

page_ctgr_list.CSV
検索方法検索文字列カテゴリ
部分一致https://abcde.newsニュース
完全一致https://fghij/business/?cid=infoニュース
部分一致https://klmno.weather天気
完全一致https://pqrst/pollen?bid=forecast天気

以下のようにカテゴリを付与する。

pvlog_ctgr.sas7bdat
IDurlカテゴリ
AAAhttps://abcde.news/categoryニュース
AAAhttps://abcde.topics
BBBhttps://fghij/business/?cid=infoニュース
CCChttps://https://klmno.weather/Japan/Tokyo天気
DDDhttps://https://klmno.tenki/world
EEEhttps://https://pqrst/pollen?bid=forecast天気

方法

  • 処理手順概要

    1. page_ctgr.csvをSDS化して、1行目から順に各列値をマクロ変数に保存
      (n行*m列のとき、n*m個のマクロ変数ができる)。
    2. pvlog.sas7bdatの各urlに対して、page_ctgr.csvの検索文字と検索方法で1行目から順に判定。
    3. 検索一致した行のカテゴリを付与。1つも一致しなければ欠損にする。
  • 実装したSASコード

* 入出力フォルダ指定(任意);libnameI_DIR="/project/input/"access=readonlylibnameO_DIR="/project/output/"* ページカテゴリ取得マクロ定義;%MACROGetPageCtgr(INPUT_DIR=,I_SDS_NM=,INFILE_NM=,OUTPUT_DIR=,O_SDS_NM=);* csvを読み込みSDSに変換;datawork.page_ctgr_list;attribsearch_typelength=$8.label="検索方法"search_stringlength=$500.label="検索文字列"page_ctgrlength=$8.label="ページカテゴリ";infile"&INPUT_DIR.&INFILE_NM."dlm=","firstobs=2dsdmissover;inputsearch_typesearch_stringpage_ctgr;run;* page_ctgr_listの行数および1行目から順に各列値をマクロ変数に保存;data_null_;setwork.page_ctgr_listend=eof;ifeofthencallsymputx("PAGE_CTGR_LIST_OBS_CNT",_N_);callsymputx(cats("SEARCH_TYPE",_N_),search_type);callsymputx(cats("SEARCH_STRING",_N_),search_string);callsymputx(cats("PAGE_CTGR",_N_),page_ctgr);run;* pvlogのurlに対応するページカテゴリを付与する;data&OUTPUT_DIR.&O_SDS_NM.;set&INPUT_DIR.&I_SDS_NM.;* 検索方法は部分一致と完全一致の2種類のみであるのは既知とし、部分一致を先に判定する;*1つも一致しないときは何もしない=ページカテゴリは欠損になる;
  select;%DOI=1%TO&PAGE_CTGR_LIST_OBS_CNT.;%IF&&SEARCH_TYPE&I..=部分一致 %THEN%DO;when(index(url,"&&SEARCH_STRING&I.."))page_ctgr="&&PAGE_CTGR&I..";%END%IF&&SEARCH_TYPE&I..=完全一致 %THEN%DO;when(url="&&SEARCH_STRING&I.."))page_ctgr="&&PAGE_CTGR&I..";%END%END;otherwise;end;run;%MENDGetPageCtgr;* マクロ実行;%GetPageCtgr(INPUT_DIR=I_DIR,I_SDS_NM=pvlog,INFILE_NM=page_ctgr_list.csv,OUTPUT_DIR=O_DIR,O_SDS_NM=pvlog_ctgr);

参考

* page_ctgr_listの行数をマクロ変数に保存;data_NULL_;setwork.page_ctgr_listnobs=page_ctgr_list_obs_cnt;callsymputx("PAGE_CTGR_LIST_OBS_CNT",page_ctgr_list_obs_cnt)run;* page_ctgr_listの1行目から順に各列値をマクロ変数に保存;data_NULL_;setwork.page_ctgr_list;%DOI=1%TO&PAGE_CTGR_LIST_OBS_CNT.if_N_=&I.thendo;callsymputx("SEARCH_TYPE&I.",search_type);callsymputx("SEARCH_STRING&I.",search_string);callsymputx("PAGE_CTGR&I.",page_ctgr);end;%END;run;
  • 検索方法やページカテゴリ別にcsvファイルを分けて管理したいとき、
    一連の処理をファイル数だけループさせると再現が可能。
    ファイル名(文字列)リストでループを回すとき、以下が参考になる。
    https://y-mattu.hatenablog.com/entry/2016/08/05/010801

所感

  • この処理を作った理由は、カテゴリリストの変更があるたびに条件式を書き換える作業を避けるためです。
  • 現在Pysparkを使うようになったため、同様の処理をPysparkで実装する内容を投稿する予定です。
  • QiitaのSASシンタックスハイライトではマクロ変数に色付けてくれないんですね。

Viewing all articles
Browse latest Browse all 92

Trending Articles