【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を統合して作成している。