I hate MICROSOFT

私が憎んでいるマイクロソフト社製品の便利小技集
悪い事は言わない、今すぐMS社製品をアンインストールしなさい

英文字・数字・数字・数字のデータだけ抽出したい。

2006-05-17 20:42:29 | I hate MS Excel

文字数4、英文字、数字、数字、数字で構成される商品コードを抽出したい。
どうしたらいいべ。

| |   A   |    B    |
| 1|商品コード  |品名       |
| 2|4902102055314 |Emblem Black   |
| 3|T800     |ターミネーター  |
| 4|MR-GU2A13BK  |Multi Card Reader |
| 5|GP03     |GALS Paradise   |
| 6|Z112     |カスタムレンズシート レッド |
| 7|Z12L     |エンブレムサイン     |

セル「C2」に関数
=AND(LEN(A2)=4,"A"<=LEFT(A2,1),LEFT(A2,1)<="Z",
"0"<=MID(A2,2,1),MID(A2,2,1)<="9",
"0"<=MID(A2,3,1),MID(A2,3,1)<="9",
"0"<=MID(A2,4,1),MID(A2,4,1)<="9")
を入れて「C7」までコピー。

| |   A   |    B    | C |
| 1|商品コード  |品名       |   |
| 2|4902102055314 |Emblem Black   |FALSE |
| 3|T800     |ターミネーター  |TRUE |
| 4|MR-GU2A13BK  |Multi Card Reader |FALSE |
| 5|GP03     |GALS Paradise   |FALSE |
| 6|Z112     |カスタムレンズシート レッド |TRUE |
| 7|Z12L     |エンブレムサイン     |FALSE |

正規表現が使えればいいのだがねぇ。
地道にやるしかないでしょう。

別解1
C2 : =LEN(A2)=4                 4文字か?
D2 : =AND("A"<=LEFT(A2,1),LEFT(A2,1)<="Z")   英文字か?
E2 : =AND("0"<=MID(A2,2,1),MID(A2,2,1)<="9")  数字か?
F2 : =AND("0"<=MID(A2,3,1),MID(A2,3,1)<="9")  数字か?
G2 : =AND("0"<=MID(A2,4,1),MID(A2,4,1)<="9")  数字か?
H2 : =AND(C2, D2, E2, F2, G2)          全てが「真」ならば「真」
「C2」から「H2」を
「C7」から「H7」までコピー

別解2
IF関数の入れ子。面倒だから書かない。
多分動かない。私の記憶が確かならば、
関数の入れ子は確か7階層までだから。

数字3文字の検査を
AND("000"<=MID(A2,2,3),MID(A2,2,3)<="999")
とやってはいけない。
7行目"12L"も引っかかって「TRUE」となってしまうぞ。

手を抜いてはいけない。

もっとエレガントな方法、募集中。
考えてみなさい。

追伸:
こんな事はExcelでは処理しない。
csvでsaveして、(たとえばtest.csv)

#!/usr/local/bin/ruby
require "jcode"
$KCODE = "S"

while gets
  if $_ =~ /^Dd{3},/
    print
  end
end

てなrubyスクリプトに通せば

$ ruby test.rb < test.csv
T800,ターミネーター
Z112,カスタムレンズシート レッド

$ ruby test.rb < test.csv > ans.csv
で抽出したans.csvが得られる。

65536行などというけちな上限もない。

それはそうと「キャバ嬢」のブログにトラックバックされた模様。
削除しようと思ったが、面白いので放っておこう。
おじさん好きらしい。「くそおやじ」に反応したか?

と思ったら一日もしないうちに消滅。
がんばって生きてね。


最新の画像もっと見る

コメントを投稿