• ベストアンサー

Perlで文字列の操作がしたい

Perlで文字列の操作がしたい ---test.txt--- あ PC 100 a b c あ HIw 100 f g h あ HIw 100 あ sHI 130 z e i あ sHI 100 f p あ sHI 100 t p 以下、3000行程度続く(空白は、タブ区切り。) -------------- 上記のようなデータがあります。 比較したいのは、a b c(3列目以降のデータ)という部分になります。(実際は、10桁の英字列です) 処理は、 1行目のabcに該当する部分は全データの中で1行のみ必要。他の行は削除。 また、ここにデータが無い場合も削除。 それ以外は、保存。 順序は問わない。 というものです。説明が難しいので下記に例を挙げました。 --例-- あ PC 100 a b c <保存。 あ HIw 100 f g h <a,b,cのいずれも含まなず、空白でもないので保存。 あ HIw 100    <a,b,cのいずれも含まない。しかし、空白なので削除。 あ sHI 130 i j f <a,b,c,f,g,hのいずれかを含むので削除。 あ sHI 100 k a  <a,b,c,f,g,h,i,jのいずれかを含むので削除。 あ sHI 100 z ab cd  <a,b,c,f,g,h,i,j,kのいずれも含まないので保存。(ab cd はひとつのかたまり) あ sHI 100 a ab cdd  <a,b,c,f,g,h,i,j,k,z,ab,cdのいずれかを含むので削除。 い sgI 100 ga adb ced  <a,b,c,f,g,h,i,j,k,z,ab,cd,cddのいずれも含まないので保存。 で結果出力は、 あ PC 100 a b c あ HIw 100 f g h あ sHI 100 z ab cd い sgI 100 ga adb ced 以上、ややこしいのですが、もし、お時間などありましたら、ご回答いただけますと幸いです。 宜しくお願い致します。 なお、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2382509 では大変お世話になりました。 このコードを応用しようと思ったのですが、条件が複雑で、私の力では無理でした。 因みに、こういったコードを作れるコツでもあるのでしょうか? 私などは、かなり考えても思いもつきませんが・・・(涙;

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

  • ベストアンサー
  • t140
  • ベストアンサー率39% (59/150)
回答No.2

#だいたいこんな感じですかね? my(%cache, @cols); while (<DATA>){ chomp; (undef, undef, undef, @cols)= split(/\t/); @cols or next; grep($cache{$_}++, @cols) and next; print $_,"\n"; # print result } __END__ あ PC 100 a b c あ HIw 100 f g h あ HIw 100 あ sHI 130 i j f あ sHI 100 k a あ sHI 100 z ab cd あ sHI 100 a ab cdd い sgI 100 ga adb ced

ayu_mi_nic
質問者

お礼

回答いただきありがとうございます。 ばっちり動作いたしました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

ベタな処理ですが・・・^^; open(IN, "test.txt"); while(<IN>){ ($d1,$d2,$d3,@ck)=split(/\t/,$_); $f=1; foreach $d (@ck){ $d=~tr/\n//d; $f = 0 if(exists($ref{$d})); $ref{$d}++ if($d ne ""); } $result.=$_ if($f && $#ck); } close IN; open(OUT, ">test.txt"); print OUT $result; close OUT;

ayu_mi_nic
質問者

お礼

回答いただきありがとうございます。 無事動作し、とても助かりました!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセル 3列おきに列を挿入したい

    いつもお世話になります。 1行目に営業所コードがあり、そのコードを3列おきに表示するにはどうしたらいいでしょうか。   A  B  C  D  E  F  G  H  I  J   2   3   4   5   7   8  11  12  14  15              ↓   A  B  C  D  E  F  G  H  I  J   2          3         4         5 営業所コードは2~150の数字で、100ほどの営業所コードが存在します。 よろしくお願いします。

  • 行・列の整理! perl

    perlでデータを並び替えて整理したいです。 【元データ】 A a b A c d A e f A g h B i j B k l B m n C o p C q r C s t C u v ・ ・ ・ 上記のデータを下記のように並び替えしたいのですが上手くできずに困っています。 どのような記述をすれば良いのでしょうか。間の空白はタブ区切りです。 【目標】 A a b c d e f g h B i j k l m n C o p q r s t u v D ・ 現在、元データから A B C D ・ ・ というデータを作り、元データと比較していますが上手くいきません。 for($i=0; $i<@key; $i++){ print OUT "$key[$i]"; for($j=0; $j<@data; $j++){ if($key[$i] =~ /$data[$j]/){    #部分一致 print OUT "$'"; } } print OUT "\n"; } 部分一致の行を正規表現を用いて上手く処理したいのですがやり方がわからず躓いています。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • コーシーの積分公式について

    コーシーの積分公式を使って、f(z)=1/{(z-a)(z-b)}とした ∮f(z) dz を求める過程に違和感を感じるので、誤っているところの指摘をお願いいたします。 f(z)=1/{(z-a)(z-b)}として、 C_ab を極a, bを囲む閉曲線, C_aを極aのみを囲む閉曲線, C_b を極bのみを囲む閉曲線とします。これらの閉曲線の向きはいずれも反時計回りとします。 このとき、極a,bを避けるような周回積分によって(a)式が成り立つと思います。 ∮_C_ab f(z) dz - ∮_C_a f(z) dz - ∮_C_b f(z) dz = 0 …(a) g(z) = 1/(z-a)とすると、 ∮_C_b f(z) = ∮_C_b g(z)/(z-b) dz = 2πi g(b) = 2πi / (b-a) …(b) h(z) = 1/(z-b)とすると、 ∮_C_a f(z) = ∮_C_a h(z)/(z-a) dz = 2πi h(a) = 2πi / (a-b) …(c) よって、 ∮_C_ab f(z) dz - 2πi / (b-a) - 2πi / (a-b) = ∮_C_ab f(z) dz = 0 …(d) となってしまいます。(d)は f(z) の正則性からしてもありえないことだと感じるのですが、どの式変形の途中で誤ってしまったのでしょうか。

  • エクセルで2列以上のものを同時に並び替えするには

    エクセルで下記のようなデーターがあるとします。 1 A  G     B  H 2 C  I  ○   D  J 3 E  K   F  L このようにひとつの項目に2行づつあるものに対して、最後に○をつけたものを先頭に2行そのまま一気に並び替えるにはどのようにすればよろしいでしょうか?要するに 2 C  I  ○   D  J 1 A  G     B  H 3 E  K   F  L このようにしたいです。 よろしくお願いいたします。

  • excelの文字列の操作について

    A列、C列、E列、G列・・・の1行目にはタイトルが入力されており、 B列、D列、F列、H列・・・には不特定の文字列が入力されており、それぞれ行数も不特定です。 A列、C列、E列、G列・・・の1行目のタイトルはA列にまとめ、B列、D列、F列、H列・・・の文字列はB列にまとめたいです。 下の例の場合だと、C列の1行目のタイトルをB列の下端の左下にあたる(A7)に移動させ、 D列の2行目から入力された文字列を右となりの(B7)に移動させたいです。これの繰り返しです。     A列     B列     C列     D列 1    あ       A       い       2             B                a   3            C                b 4              D               c 5             E                6              F                            ↓     A列     B列     C列     D列 1    あ       A              2             B                   3            C                 4              D                5             E                6              F      7      い      a 8             b 9             c よろしくお願いします。

  • テキストをExcel2000に貼り付け

    .txtを参照してファイル内容を、マクロで Excel2000に貼り付けたいと考えています。 先頭の1行は決まっていて2行目からが 対象になります(コロン区切りのファイルです) コロンは削除してA~Jまでの文字を ExcelのA~Jのセルに貼り付ける 例).txtの記述 START :A :B :C :D :E :F :G :H :I :J :A :B :C :D :E :F :G :H :I :J :A :B :C :D :E :F :G :H :I :J ExcelのA1セルから最大20000行まで対応したいです。 どうかご教授願います。

  • 巨大なCSVの加工(指定列のみの抽出)について

    巨大なCSVの加工(指定列のみの抽出)について 下記のような構成のCSVファイルがあります。 "ID","a","b","c","d","e","f","g","h","i","j","k","l","m" "0001","a","b","c","d","e","f","g","h","i","j","k","l","m" "0003","a","b","c","d","e","f","g","h","i","j","k","l","m" "0004","a","b","c","d","e","f","g","h","i","j","k","l","m" ・ ・ ・ 例えば、 ここから"ID"列と"c"列と"f"列のみ抽出して新たなCSVファイルで保存。 という処理を行いたいのですが、行数が5000万行近くあり、ファイルサイズが80GB程あるので エクセルはおろかアクセスでも開くことができません。 テキストエディタの秀丸64bit版なら開くことができますが、指定列の抽出方法が分かりません。 秀丸のマクロでもVBSでも良く、また膨大な待ち時間がかかっても構わないので実現する方法について お知恵をお貸しください。

  • エクセル 文字列を分割するマクロについて

    1行目から200行目くらいまで、A列に次のようなデータが入っています。 (A1セル) A 1 A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S このデータを下記のようにカンマごとに別のセルに分割するマクロを 教えていただけないでしょうか。 A1に「A」を、S1に「S」を入れたいと思っています。  A B C ・・・ R S 1 A B C ・・・ R S

  • 列A,列Bを参照して列Cにそれに対応する文字列を表示

    列A,列B,列C 4,8,A 4,9,B 4,10,B 4,11,C 4,12,C 4,13,D 3,8,E 3,9,F 3,10,F 3,11,G 3,12,G 3,13,H 2,8,I 2,9,J 2,10,J 2,11,K 2,12,K 2,13,L 1,8,M 1,9,N 1,10,N 1,11,O 1,12,O 1,13,P 列Aに1~4,列Bに4~20の値を入れ、 列Cに、計算式で上記のような文字列を表示させたいのですが、 if関数のネストが7つまでらしく8つ以上が出来ません。 何か方法がありましたらお願いします。 =IF(AND(A2=4,B2<=08),"A" ,IF(AND(A2=4,B2<=10),"B" ,IF(AND(A2=4,B2<=12),"C" ,IF(AND(A2=4,B2>=13),"D" ,IF(AND(A2=3,B2<=08),"E" ,IF(AND(A2=3,B2<=10),"F" ,IF(AND(A2=3,B2<=12),"G" ,IF(AND(A2=3,B2>=13),"H"))))))))

  • 文字列の抽出について

    A列に 500行位の文字列があり、 その行の中から以下を抽出したいです。 ただ、抽出したい文字列は、0123456で始まり、abcdという文字列まで。 しかも改行されています。 ※抽出したい文字列 【A列 0123456 ~ B列 abcd】という文字列 【F列 0123456 ~ B列 abcd】という文字列 A列 0123456 B列 xxxx abcd C列 1111 D列 2222 E列 3333 F列 0123456 G列 xxxx abcd H列 4444 I列 5555 J列 6666 宜しくお願い致します。

このQ&Aのポイント
  • お金を稼ぐことに関して最適な行動を取れない理由とは?
  • 相場価格の半値ぐらいの値段で出品してしまう選択
  • 合理的な判断をするための訓練方法は?
回答を見る

専門家に質問してみよう