【Lifehacks】データリストの正規化を行う

■タスク
 データリストに含まれるデータについて同一視すべきデータの形式を揃え正規化する。


■背景
・各種作業の前処理として良く必要となる処理。
・なるべく簡単に実施したい。


■方法
 Cygwin32/UNIX互換ツールと、過去に作った幾つかのスクリプトを組み合わせて実現。

SgUniqList.bat
データリストの一意化を行う。
http://d.hatena.ne.jp/Orihika/20091201
SgCmpList.bat
2つのリストから和・差・積集合を求める
http://d.hatena.ne.jp/Orihika/20070327
SgForSample02.bat
バッチスクリプトのFor文を活用する02
http://d.hatena.ne.jp/Orihika/20071206


■メモ
 なんらかのデータの整形・集計を行う際、素データに表記のゆれがある場合前処理として同一視すべきデータの形式を揃え正規化しておく必要があることがあります。
 表記ゆれの範囲がアルファベットの大文字・小文字の差異程度なら、Cygwin32/UNIX互換ツールの組み合わせレベルで簡単に処理が可能です。
 なおゆれの種類が多い場合は強制的に正規形を決める(全て大文字にするなど)方が効率的ですが、本例では途中手動で正規形への変換テーブルを指定するようにしています。


■使用方法
1.SgNormalizeListStep01.batを実行。
 →Result.txtに正規化対象データが抽出される。
2.SgNormalizeListStep02.sedに正規化対象ユーザの表記ゆれ解消記述を行う。
3.SgNormalizeListStep02.batを実行。
 →Output_Normalized.txtに正規化済みデータが得られる。


■プログラム

:
: SgNormalizeListStep01.bat
: データリストの正規化を行う:Step01
:
: Author: Orihika Ikuo
: Create: 2009.10.01
: Update: 2009.11.24
: Update: 2009.12.01
:

set Cygwin=C:\0_Software\cygwin\bin
set Sort=%Cygwin%\sort


:
: SgUniqList.batから流用
:
set Input=Input.txt
set Output01_Case=Output01_Case.txt
set Output02_IgCase=Output02_IgCase.txt

%Sort%    < %Input% | uniq    | %Sort% -f > %Output01_Case%
%Sort% -f < %Input% | uniq -i             > %Output02_IgCase%


:
: SgCmpList.batから流用
:
set List01=%Output01_Case%
set List02=%Output02_IgCase%

set Union=Union.txt
set Intsec=Intsec.txt
set Only01=OnlyC_ToNorm.txt
set Only02=OnlyI_MaybeNothing.txt

cat %List01% %List02% | %Sort% | uniq    > %Union%
cat %List01% %List02% | %Sort% | uniq -d > %Intsec%
cat %List01% %Intsec% | %Sort% | uniq -u > %Only01%
cat %List02% %Intsec% | %Sort% | uniq -u > %Only02%


:
: SgForSample02.batから流用
:
set Result=Result.txt
set DataList=%Only01%

del %Result%

:For01
for /f %%i in (%DataList%) do call :SubRoutine01 %%i
  goto End_Of_For01
  :SubRoutine01
    grep -i %1 %Output01_Case% >> %Result%%
  goto :EOF
:End_Of_For01
:
: SgNormalizeListStep02.bat
: データリストの正規化を行う:Step02
:
: Author: Orihika Ikuo
: Create: 2009.10.01
: Update: 2009.11.03
: Update: 2009.12.01
:

set Input=Input.txt
set Output=Output_Normalized.txt

sed -f SgNormalizeListStep02.sed < %Input% > %Output%


注:
Windows環境ではWindowsのsortコマンドと区別するためCygwin32のパスを明記している。
・SgNormalizeListStep01.batはSgUniqList.bat・SgCmpList.bat・SgForSample02.batを統合して作成している。