教えてください。No.04816
SUNAGA さん 05/08/02 15:16
 
はじめまして、須永と申します。
ある団体のデータ管理をしておりますが、データの変換作業が
時たまあります。人伝に秀丸エディターの話を聞き購入しまし
たが使い方が判りません。ベテランお方のお力添えをお願いし
たく投稿しました。

<内容>
下記の様な同一名が2〜3行にわたっているデータが多くあり
ます。
この同一漢字氏名(ID)があった場合に、最新登録日のみを
残して古い登録日のデータ行を削除するにはどのようにすれば
よいか教えてください。

F−, ID , 漢字氏名,,カナ氏名 , 登録日(147桁目で改行)
00001,2822555,山田太郎,,ヤマダタロウ,05/06/20  ↓
00002,2822555,山田太郎,,ヤマダタロウ,05/06/10  ↓
00003,2822555,山田太郎,,ヤマダタロウ,05/05/20  ↓ 
00004,5531265,鈴木一郎,,スズキイチロウ,05/03/21 ↓
 ・
 ・
11058,1436217,山田五郎,,ヤマダゴロウ,05/06/30  ↓
11059,3251761,渡辺一郎,,ワタナベイチロウ,05/07/23↓
11060,3251761,渡辺一郎,,ワタナベイチロウ,05/06/30↓ 

[ ]
RE:04816 教えてください。No.04817
Kamonohasi さん 05/08/02 17:06
 
こんにちは、カモノハシと申します。
須永さん、題名に「教えてください。」は不適切だと思いますよ。

私個人では、この手の作業は秀丸でやる必要を感じません。
業務で使っているようですからExcelなどでやったほうが楽ですよ。
ただ、それだけではなんですので……。
データの先頭に「F−avなんて仕様不明の物があるせいで面倒に感じられますね。
それを一時的にデータの最後に持って行けば楽になります。
与えられた条件が曖昧ですからダメな場合もあるかもしれませんが、
末尾のマクロでどうでしょうか。
秀丸5.0bでソートモジュールが使えることが前提条件です。
手抜きのため最初にいらないデータが入る可能性があります。
まぁ私もたまに秀丸に無理やりなことをさせるので人のことを言えませんが(汗)
**********************************************************************
disabledraw;
gofiletop;
escape;
beginrect;
right 6;
down linecount2;
endsel;
cut;
gofiletop;
golineend2;
pasterect;

#linecount2 = linecount2;
$text="";
selectall;
filter "Sort.hmf" , "Sort" , "1001";
gofiletop;
escape;
while(#linecount2 > 0){
 searchdown "/", noregular;
 moveto foundtopx-3 , y;
 $buf = gettext(x,y,6,y);
 if($text == $buf){
  deleteline;
  golinetop2;
 }else{
  moveto 0,y+1;
 }
 $text = $buf;
 #linecount2 = #linecount2 -1;
}
gofiletop;
golineend2;
escape;
beginrect;
left 6;
down linecount2;
cut;
gofiletop;
pasterect;
selectall;
filter "Sort.hmf" , "Sort" , "0001";
gofiletop;
escape;
enabledraw;

[ ]
RE:04817 教えてください。No.04818
SUNAGA さん 05/08/02 20:32
 
須永です

カモノハシ様 
ありがとうございました。
・・・・「教えてください。」気おつけます。




>こんにちは、カモノハシと申します。
>須永さん、題名に「教えてください。」は不適切だと思いますよ。
>
>私個人では、この手の作業は秀丸でやる必要を感じません。
>業務で使っているようですからExcelなどでやったほうが楽ですよ。
>ただ、それだけではなんですので……。
>データの先頭に「F−avなんて仕様不明の物があるせいで面倒に感じられますね。
>それを一時的にデータの最後に持って行けば楽になります。
>与えられた条件が曖昧ですからダメな場合もあるかもしれませんが、
>末尾のマクロでどうでしょうか。
>秀丸5.0bでソートモジュールが使えることが前提条件です。
>手抜きのため最初にいらないデータが入る可能性があります。
>まぁ私もたまに秀丸に無理やりなことをさせるので人のことを言えませんが(汗)
>**********************************************************************
>disabledraw;
>gofiletop;
>escape;
>beginrect;
>right 6;
>down linecount2;
>endsel;
>cut;
>gofiletop;
>golineend2;
>pasterect;
>
>#linecount2 = linecount2;
>$text="";
>selectall;
>filter "Sort.hmf" , "Sort" , "1001";
>gofiletop;
>escape;
>while(#linecount2 > 0){
> searchdown "/", noregular;
> moveto foundtopx-3 , y;
> $buf = gettext(x,y,6,y);
> if($text == $buf){
>  deleteline;
>  golinetop2;
> }else{
>  moveto 0,y+1;
> }
> $text = $buf;
> #linecount2 = #linecount2 -1;
>}
>gofiletop;
>golineend2;
>escape;
>beginrect;
>left 6;
>down linecount2;
>cut;
>gofiletop;
>pasterect;
>selectall;
>filter "Sort.hmf" , "Sort" , "0001";
>gofiletop;
>escape;
>enabledraw;

[ ]
RE:04816 教えてください。No.04819
ENCODINGSHIFTJIS さん 05/08/03 15:26
 
SQLでもやってみました、出力形式の調整は残っていますが

-------------- T.CSV
F−,ID,漢字氏名,dummy,カナ氏名,登録日
00001,2822555,山田太郎,,ヤマダタロウ,05/06/20  ↓
00002,2822555,山田太郎,,ヤマダタロウ,05/06/10  ↓
00003,2822555,山田太郎,,ヤマダタロウ,05/05/20  ↓ 
00004,5531265,鈴木一郎,,スズキイチロウ,05/03/21 ↓
11058,1436217,山田五郎,,ヤマダゴロウ,05/06/30  ↓
11059,3251761,渡辺一郎,,ワタナベイチロウ,05/07/23↓
11060,3251761,渡辺一郎,,ワタナベイチロウ,05/06/30↓ 
--------------- R.SQL
SELECT MAX(F−),ID,漢字氏名,カナ氏名,MAX(登録日)
FROM T.CSV
GROUP BY ID,カナ氏名,漢字氏名

--------------- LogParser で実行
C:\Program Files\Log Parser 2.2>LogParser.exe FILE:R.SQL
MAX(ALL F−) ID      漢字氏名 カナ氏名     MAX(ALL 登録日)
------------ ------- ---- -------- ------------
3            2822555 山田太郎 ヤマダタロウ   05/06/20  ↓
4            5531265 鈴木一郎 スズキイチロウ  05/03/21 ↓
11058        1436217 山田五郎 ヤマダゴロウ   05/06/30  ↓
11060        3251761 渡辺一郎 ワタナベイチロウ 05/07/23↓

統計情報:
---------
処理された要素: 7
出力された要素: 4
実行時間:       0.02 秒
ーーー---------------

Log Parser 2.2 日本語版
http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&DisplayLang=ja

[ ]
RE:04819 教えてください。No.04820
SUNAGA さん 05/08/03 17:45
 
須永です

ありがとうございました。
SQLの方が簡単に出来そうです。
SQLのわかる人に聞いてやってみます。
ありがとうございました。



>SQLでもやってみました、出力形式の調整は残っていますが
>
>-------------- T.CSV
>F−,ID,漢字氏名,dummy,カナ氏名,登録日
>00001,2822555,山田太郎,,ヤマダタロウ,05/06/20  ↓
>00002,2822555,山田太郎,,ヤマダタロウ,05/06/10  ↓
>00003,2822555,山田太郎,,ヤマダタロウ,05/05/20  ↓ 
>00004,5531265,鈴木一郎,,スズキイチロウ,05/03/21 ↓
>11058,1436217,山田五郎,,ヤマダゴロウ,05/06/30  ↓
>11059,3251761,渡辺一郎,,ワタナベイチロウ,05/07/23↓
>11060,3251761,渡辺一郎,,ワタナベイチロウ,05/06/30↓ 
>--------------- R.SQL
>SELECT MAX(F−),ID,漢字氏名,カナ氏名,MAX(登録日)
>FROM T.CSV
>GROUP BY ID,カナ氏名,漢字氏名
>
>--------------- LogParser で実行
>C:\Program Files\Log Parser 2.2>LogParser.exe FILE:R.SQL
>MAX(ALL F−) ID      漢字氏名 カナ氏名     MAX(ALL 登録日)
>------------ ------- ---- -------- ------------
>3            2822555 山田太郎 ヤマダタロウ   05/06/20  ↓
>4            5531265 鈴木一郎 スズキイチロウ  05/03/21 ↓
>11058        1436217 山田五郎 ヤマダゴロウ   05/06/30  ↓
>11060        3251761 渡辺一郎 ワタナベイチロウ 05/07/23↓
>
>統計情報:
>---------
>処理された要素: 7
>出力された要素: 4
>実行時間:       0.02 秒
>ーーー---------------
>
>Log Parser 2.2 日本語版
>http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&DisplayLang=ja

[ ]
RE:04818 教えてください。No.04821
Kamonohasi さん 05/08/03 21:40
 
こんばんは、カモノハシです。
なにやらLogParser使った手法で解決されたような雰囲気ですが、
前出のマクロは試していただけたのでしょうか?
ここは有償でサポートを行っている場ではありません。
私の場合は、今回のお題に面白そうな解法を思い立ったのでやってみただけでした。
私の管理する場ではありませんので、どうしろと言うつもりはないですが、
ENCODINGSHIFTJIS さんの回答にも似たような事をしているようでしたので……。

出来れば、実行してみてうまく行ったのか、うまく行かなかったのならば、どこが
まずかったのか、どう手直しすればうまく行ったのかなどを報告していただけると
私自身にとって、今後プラスになる事があるかも知れないので嬉しいです。

[ ]
RE:04821 教えてください。No.04826
SUNAGA さん 05/08/10 19:24
 
須永です

マクロもSQLも旨く動かなくて、手作業で削除しました。
一段落したのでフォーラムを見ました。
まるっきしの初心者ですので、貴重なアドバイスを理解でき
ませんでした。これを機会に一歩ずつ習って行きたいとおもいます。
ありがとうございました。

-----------------------------------------------------

>こんばんは、カモノハシです。
>なにやらLogParser使った手法で解決されたような雰囲気ですが、
>前出のマクロは試していただけたのでしょうか?
>ここは有償でサポートを行っている場ではありません。
>私の場合は、今回のお題に面白そうな解法を思い立ったのでやってみただけでした。
>私の管理する場ではありませんので、どうしろと言うつもりはないですが、
>ENCODINGSHIFTJIS さんの回答にも似たような事をしているようでしたので……。
>
>出来れば、実行してみてうまく行ったのか、うまく行かなかったのならば、どこが
>まずかったのか、どう手直しすればうまく行ったのかなどを報告していただけると
>私自身にとって、今後プラスになる事があるかも知れないので嬉しいです。

[ ]
RE:04820 教えてください。No.04827
ENCODINGSHIFTJIS さん 05/08/11 19:24
 
別解を、一押ししておきます。

-u オプションの効く SORT コマンドを使う。

> sort -t , -k 2,2 -k 6,6r sortin.txt | sort -u -m -t , -k 2,2

11058,1436217,山田五郎,,ヤマダゴロウ,05/06/30  ↓
00001,2822555,山田太郎,,ヤマダタロウ,05/06/20  ↓
11059,3251761,渡辺一郎,,ワタナベイチロウ,05/07/23↓
00004,5531265,鈴木一郎,,スズキイチロウ,05/03/21 ↓
------------------
でした。coLinux で実行確認

処理説明
-t 項目区切りは ,
ID を昇順に、 登録日を 降順に 整列。
次に
-m マージモードで、IDキー の ユニーク出力をする。

[ ]