• ベストアンサー

該当項目表示について

csvデータの列に%で区切った項目があります。 例) 1行目:aaa%bbb%ccc 2行目:aaa&bbb%ddd 3行目:aaa%bbb 3番目の項目(上記例ではccc、ddd)を 1、2番目の項目に該当させるには以下のスクリプトをどのように 変更すればよろしいのでしょうか? いろいろ調査や変更実行してみましたがうまく動きません。 $find = 0; for($d = 0 ; $d < @TEST ; ++$d) { chomp $TEST[$d]; (@ITEM) = split(/\,/, $TEST[$d]); @T = split(/\%/, @ITEMD[2]); #csvデータ内項目%区切り if($in{'item'} eq @T[0]) { if(($in{'item2'} eq "") or ($in{'item2'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item2'} eq @T[1]) { @FIND[$find] = $TEST[$d]; $find++; } } } 上記スクリプトに3番目も含める為にはどのようにすればよいのでしょうか? ご教授お願いいたします。

  • x01ht
  • お礼率47% (10/21)
  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

$T[2] では駄目なのでしょうか? > 3番目の項目(上記例ではccc、ddd)を > 1、2番目の項目に該当させる すみませんがよくわからなかったので、他人が見てもわかりやすいように、もっと具体的に解説していただけませんでしょうか。

x01ht
質問者

お礼

ご回答ありがとうございます。 T[2] にして、3項目を該当させるコードを付け足し解決することができました。 ありがとうございました。

その他の回答 (1)

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.2

配列を扱う場合には、添え字を使わないほうがコードが分かり易いです。 Perlには、C言語には真似のできない便利な記述法があります。 以下のコードは未確認です。 for (@TEST) { # 各項目は$_へ chomp; # 改行を削除(本当に必要?) my @ITEM = split /,/; # ","はそのまま指定可能、$_は省略可能 my @T = split /%/ => $ITEMD[2]; # csvデータ内項目%区切り # 入力を1つにつなげる # "全て"のときは""と同じ扱いとする my @in; push @in => $in{'item'}, $in{'item2'}, $in{'item3'}, "STOPPER"; my @Tester; push @Tester => @T, "STOPPER"; # ""のときはN番目の項目を指定したことにする my @Temp = @Tester; for (@in) { $_ = "" if $_ eq "全て"; my $Temp1 = shift @Temp; $_ = $Temp1 if $_ eq ""; } # 1つにつなげて比較、一致すれば取り込む my $in_str = join "\t" => @in; my $T_str = join "\t" => @Tester; if ($in_str eq $T_str) { push @FIND => $_ } }

x01ht
質問者

お礼

ご回答ありがとうございます。 回答いただきましたコード、勉強になります。 添え字を使わない方法は確かに分かり易いですね。 参考にさせていただきます。 ありがとうございました。

関連するQ&A

  • 該当項目表示についての追加質問

    csvデータの列に%で区切った項目があります。 例) 1行目:aaa%bbb%ccc 2行目:aaa&bbb%ddd 3行目:aaa%bbb csvデータ内にはaaaは3個だけですが下記コードで実行すると aaaが6個と計算されます。bbb、ccc、dddの個数は正確に計算されます。 $find = 0; for($d = 0 ; $d < @TEST ; ++$d) { (@ITEM) = split(/\,/, $TEST[$d]); @T = split(/\%/, @ITEMD[2]); #csvデータ内項目%区切り if($in{'item'} eq @T[0]) #@T[0]にaaaが入ります { if(($in{'item2'} eq "") or ($in{'item2'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item2'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++; } if($in{'item2'} eq @T[1]) { if(($in{'item3'} eq "") or ($in{'item3'} eq "全て")) { @FIND[$find] = $TEST[$d]; $find++; } elsif($in{'item3'} eq @T[2]) { @FIND[$find] = $TEST[$d]; $find++;     }    }   } } ご教授お願いいたします。

    • ベストアンサー
    • Perl
  • 【エクセル】空セルを埋める方法

    お世話になります。 下記のような表があります。 1行目:AAA,BBB,CCC,DDD 2行目:空セル,BBB,CCC,DDD 3行目:空セル,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:空セル,BBB,CCC,DDD ・・・ こんなパターンの行が結構あります。 空セル部分を下記のように埋めたいのですが 1行目:AAA,BBB,CCC,DDD 2行目:AAA,BBB,CCC,DDD 3行目:AAA,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:aaa,BBB,CCC,DDD てっとり早く埋める方法ありませんか? いまは、【ctrl+↓】 ⇒【↑】⇒【ctrl+D】を延々繰り返しています。 宜しくお願いいたします。

  • MySQLで1つの項目に対しての集計

    1つの項目内にカンマ等で区切られたデータがあります。その数を下の2種類のように集計する事って可能でしょうか? 例) KEY  項目 ----------------- 1   AAA,BBB,CCC 2   AAA,CCC 3   CCC,DDD 1) ----------------- 1  3(件) 2  2(件) 3  2(件) 2) ----------------- AAA  2(回) BBB  1(回) CCC  3(回) DDD  1(回) よろしくお願いします。

  • タブ区切りのデータでnullのデータも配列に入れるには

    以下のようなタブ区切りデータ列を配列に入れたいと思っています。 (わかりやすいようにタブ区切りの部分を"\t"にしました。実際はタブが入っています) $test_string = "aaa\tbbb\tccc\t\t\tddd"; 単純に $word = split("\t",$test_string); とすると $word[0] = "aaa", $word[1] = "bbb", $word[2] = "ccc", $word[3] = "ddd" になるようです。 nullデータも配列に入れて $word[0] = "aaa", $word[1] = "bbb", $word[2] = "ccc", $word[3] = "" $word[4] = "", $word[5] = "ddd" にしたいと思っていますが、どうやればいいのかわかりません。 ご存知の方、ご教授ください。

    • ベストアンサー
    • PHP
  • ある項目(数値)に加算したものでソートしたい。

    ある項目(数値)に加算したものでソートしたい。 下のようなテーブルがあります。 そのpointに加算した結果でソートしたいのですが、可能でしょうか? テーブル name  | point ああAAA| 100 ああBBB| 400 いいCCC| 300 ううDDD | 200 おおCCC| 500 ============== ふつうにORDER BY point DESC でソートすると下記のようになります。 おおCCC| 500 ああBBB| 400 いいCCC| 300 ううDDD | 200 ああAAA| 100 ============== そこでpointに加算した結果(dbには反映させず、あくまで表示上のみ) name[ *CCC]にはpointに80%加算 いいCCC 300→540 おおCCC 500→900 ソート結果 おおCCC| 900 いいCCC| 540 ああBBB| 400 ううDDD | 200 ああAAA| 100 ============== このような事は可能でしょうか?

  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • vbs csv内の一部の値を連結

    vbsで以下のように編集したいです。 <編集前>    A     B  C   D   E 1 aaa@aaa.jp 田中 男性 test001 数学 2 bbb@bbb.jp 石田 男性 test002 英語 3 ccc@ccc.jp 佐藤 女性 test003 科学 4 ddd@ddd.jp 伊藤 男性 test004 社会 <編集後>    A     B      C  D   E   F 1 test001_aaa aaa@aaa.jp 田中 男性 test001 数学 2 test002_bbb bbb@bbb.jp 石田 男性 test002 英語 3 test003_ccc ccc@ccc.jp 佐藤 女性 test003 科学 4 test004_ddd ddd@ddd.jp 伊藤 男性 test004 社会 <編集内容> D列の値とA列のメールアドレスの「@」の前をアンダースコアを挟み、連結させる。 可能であればコードのご教示宜しくお願い致します。 説明に不備等あればお知らせください。 コードの説明もあれば嬉しいです。

  • Excel 2つのシートを比較して重複項目を出力

    旧データと新データの2つを管理しているExcelファイルがあります。 シート1には旧データがシート2には新データがあります。 新データは旧データに幾つかの商品が追加されております。 シート1のデータを参照してシート2に旧データの番号を追加したいです。 --------------- シート1 --------------- AAA 123 BBB 456 --------------- --------------- シート2 3番目に旧データにあるシート1の2番目の項目を表示したいです --------------- AAA 111 BBB 222 CCC 333 DDD 444 --------------- ↓こんな感じにしたいです。 --------------- 処理後のシート2  --------------- AAA 111 123 BBB 222 456 CCC 333 - DDD 444 - --------------- わかりにくい説明ですみません。 商品番号が変わったのですが400件近くあるので まとめて更新したかったので質問させて頂きました。

  • 正規表現で一つ目の区切り文字で区切りたいのですが・・・

    aaa/bbb/ccc/ddd aaa/bbb/ccc/ddd/eee aaa/ccc/ddd $a=~/(.*)\/(.*)/; $1はそれぞれ aaa/bbb/ccc aaa/bbb/ccc/ddd aaa/ccc と成ってしまいます。 このように 「最後の/」で分けられてしまいます。 一つ目の/で分けるにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

専門家に質問してみよう