• 締切済み

項目の比較

perlでタブ区切りのテキストデータに、タイトルと文章が入っているとします。 タイトルのは同じタイトルのものが重複していますが、種類は5種類ぐらいです。 ここで、タイトルの名前が変わった時一回だけ、見出しの様な感じで出力したいんですが、(要するに重複しているタイトルは出力せず、文章は重複していないので全て出力したいです。) 初心者の為よく分かりません。 とりあえず、項目分割して単純に出力する事は出来ます。 項目の重複をどのようにしたら調べられるのか教えて下さい; 初歩的な事ですが、どなたか分かる方いましたらお願いします。

  • Perl
  • 回答数4
  • ありがとう数3

みんなの回答

noname#9431
noname#9431
回答No.4

タイトルは 文書番号 年代 作成者 大項目 中項目 01 享保9甲辰年 不明 一 1 02 文化14丁丑年 不明 一 1 03 (文久元酉年11月) 奉行 二 1 04 文久元年酉11月 奉行 二 2 の様に、 文書番号、 年代 、作成者 、大項目、 中項目、 の5つから成るとします。 (コードには小項目などもあるようでしたが無視しました。) 重複しているタイトルは出力しないという場合の 「重複判断」の規準がご説明だけからははっきりしなかったので、 5つの項目の内1つでも一致してたら「重複している」という判断とします。 一致は完全な一致です。だから、 (文久元酉年11月) と 文久元年酉11月 とでは かっこの文だけ異なるのでこの項目に関しては「異なる」と判断します。 このとき、重複のないタイトルだけを表示するには 以下の様にするといいかもしれません。 ただし、補足いただいたのコードではデータはもっと多くの項目からなっていて タイトルはその一部をとったもののようですが、 いまは、データファイルには5つのフィールドしかないという下で考えてます。 >文章は重複していないので全て出力したい の部分は補足の内容だけからはよく意味がわからなかったので、 (データファイルのどの位置に「文章」があるのか等) 無視しました。 #!/usr/bin/perl -w use strict; open (IN,"test.txt"); my @last_title=(0 .. 4); while (<IN>) { chomp; my @title=split(/\s/); { my $term; for ($term=0; $term < @title; $term++){ last if ( $title[$term] eq $last_title[$term]) ; } if ($term == @title) { print $_,"\t" foreach @title; print "\n"; @last_title=@title; } } } close(IN);

noname#9431
noname#9431
回答No.3

すみません。2度同じことを書いてしまいました。 消し忘れです。 説教臭くなってすみません。。。

paraiso1210
質問者

お礼

>説教臭くなってすみません。。。 とんでもないです!わかりにくい説明で申し訳ないです;ご丁寧にありがとうございます。 一応下に自分で書いたものを載せました。 たぶん間違いだらけだと思います; こんなんでショボくて申し訳ないですが、コメントいただけると助かります!

paraiso1210
質問者

補足

文書の種類としては、歴史の資料の様なものです。 文書番号 年代 作成者 大項目 中項目 01 享保9甲辰年 不明 一 1 02 文化14丁丑年 不明 一 1 03 (文久元酉年11月) 奉行 二 1 04 文久元年酉11月 奉行 二 2 といった感じです。 大項目などのタイトルが重複しています。それぞれ一回だけ出力したいのです。 自分で書いたものは以下のものです。 途中までしか書けてない上に説明下手で申し訳ありません; while (<IN>) { # 項目分割する @IN = split(/\t/); $nunber = $IN[0]; $nendai = $IN[2]; $sakusei = $IN[3]; $daik = $IN[7]; $chuk = $IN[8]; $syok = $IN[9]; $komidasi = $IN[10]; # 見出し名が変わったら出力 if(){ my %count; @array = grep(!$count{$_}++, @array); } &SYUTURYOKU; } # 出力用サブルーチン sub SYUTURYOKU{ printf(OUT "$nunber\t$nendai\t$sakusei\t$daik\t$chuk\t$syok\t$komidasi\n"); } # ファイルを閉じる close(IN); close(OUT); こんな感じで分かりますでしょうか?

noname#9431
noname#9431
回答No.2

質問の内容が少々くみ取りにくいのですが、 (技術系の質問ではやりたいことを具体的に書いた方がよりよい解答がえられるとおもいます。また、自分の書いたコードもあわせて書いて頂けるとなにが問題か回答者が理解するたすけにもなります。) title1 content1 title1 content2 title2 content3 title3 content4 title3 content5 の内容を(タブ区切り)(test.txt) title1 content1 content2 title2 content3 title3 content4 content5 と表示したいのだと理解します。 この場合、例えば、 #!/usr/bin/perl -w use strict; open (IN,"test.txt"); my $last_title=""; while (<IN>) { chomp; my ($title, $content) = split(/\t/,$_); if ( $title ne $last_title) { print "$title\n"; $last_title=$title; } print "$content\n"; } close (IN); こんなのでできます。 あくまで一例です。解答というより、自分の練習のために書きました。 # 技術系の質問では、やりたいことをもう少し具体的に書いた方がよりよい解答が得られると思いますよ。また、自分の書いたコードもあわせて書いた方が、何が問題か回答者が理解する助けにもなると思います。 ご参考まで~

回答No.1

こんな感じでしょうか? テストしていないので動くかどうかはわかりませんが参考までに if ($title == $save_title) { //退避していた内容と同じであれば空出力  echo " \n"; }else{ //退避していた内容と違っていればタイトル出力  echo "$title\n";  $save_title = $title }

paraiso1210
質問者

お礼

早速のご回答ありがとうございます。 $save_titile 「退避していた内容~」というのは、もう一つ同じファイルを作ってそれを比較すると言う事でしょうか??よく分かってなくてすみません; if~else文を使えばいいのは、何となく分かっていたんですが、項目をどうやって比較したらいいのかよく分からないです; 項目を一行ずつ読み込んで、読み込んだ項目を格納して比較すればいいのでしょうか? その格納の仕方が分かってないんです; もし宜しければその辺りを教えて下さると助かります!

関連するQ&A

  • Windowsサーバ上で動作するデータ項目編集ツールについて

    入力:CSV形式(タブ区切り)のテキストファイル(出力も同じ) を、入力してタブで区切った項目を編集できるツールを探しています。 (OS:Windows2000) <たとえば>    (1) (2) (3) (4) (5) 入力:a b c d 123-4567 出力:a d c b 123-4 入力:(1)→出力:(1) 入力:(2)→出力:(4) 入力:(3)→出力(3)  入力:(4)→出力:(2) 入力:(5)の1-5桁→出力:(5) パラメータ指定などで、上記のような編集のできるツールがあったら、 教えて下さい。宜しくお願い致します。

  • 区切り文字をTABにしたい

    CGI-Perl初心者です。 エントリデータを、カンマ区切りテキストデータで保存するようにしていますが、(入門書のファイル操作を参照しながら何とか作れた代物です)後で大きな問題が発生しました。このデータには金額を入れる項目があって、例えば10,000円とカンマを入れると当たり前ですが、区切り文字と判断して10と000円を分けてしまうのです。そこでTAB区切りテキストデータに変更したいのですが、 $data=join(",",変数,変数,変数,変数); としている","の部分をタブにするにはどうしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • 同ページ内の上を見にく「このページのTOPへ」の作り方

    HP作成の初心者です。 ホームページピルダーを使用しています。 質問タイトルの通りなのですが、ページ上部に見出しを並べて 下に文章を書いていった時、文章の区切り区切りで 「このページのTopへ」という文字をクリックすると上の見出しに戻るという様にしたいのですがどのようにすればよいのでしょうか? アドバイスよろしくお願いします。

  • タブ区切りのテキストファイルの項目を並び変えたいのです。

    タブ区切りのテキストファイルの項目を並び変えたいのです。 例えば、 A りんご 犬 赤 B みかん ねこ 黄 C パイナップル ねずみ 緑 という風にタブ区切りで並んでいるテキストファイルを 赤 りんご 犬 A  黄 みかん ねこ B  緑 パイナップル ねずみ C  などという風に項目を並び変えたいのです。 EXCELに一度取り込んでVBAでコーディングすればよいのでしょうか? 具体的にどのように記述すればよいかお願いいたします。 また、インストールなどはせずに単体で動かしたいのですが、VBAではなく他の方法もあれば教えてください。

  • 【DOSバッチ開発】末尾のタブのみ削除したい

    DOSバッチ開発で困っています。 あるテキストファイル(DBから出力したタブ区切りのファイル)に n行データが入っています。 1行につき133項目もっています。 各行の最後の項目は必ずタブがあります。 この末尾のタブのみ削除してファイルを置き換えたいです。 バッチ開発経験が浅いため、うまく作成ができません。 よろしくお願いいたします。

  • perlでファイルを読み込んだ順で重複行チェック

    perl初心者です。 ファイルを読み込んで重複行について以下の処理をおこないたいです。 ハッシュを使えば比較的苦労しないでできそうなのですが、 ファイルを読み込んだ順に出力をしたいので悩んでいます。 アドバイスをお願いします。 やりたいこと。 ・タブ区切りのファイルを読み込む ・ファイルの出力順は入力ファイルの上から順とし、並び替えを変えたくない。 ・重複行だけのファイルと重複していないファイルを作りたい。←パターン1,パターン2 例) 以下の入力ファイル(タブ区切り)についてidをキーに重複行チェック 入力ファイル id name age 1 質問一郎 20 2 質問和美 30 3 質問次郎 40 1 回答花子 50 3 回答太郎 22 ・パタン1の出力 重複ファイル 1 質問一郎 20 1 回答花子 50 3 質問次郎 40 3 回答太郎 22 ユニークファイル 2 質問和美 30 --------------------- ・パタン2の出力 ※ 重複ファイル 1 質問一郎 20 1 回答花子 50 3 質問次郎 40 3 回答太郎 22 ユニークファイル 1 質問一郎 20 2 質問和美 30 3 質問次郎 40 パターン2の場合、ユニークファイルには最初に読み込んだ重複ファイル1行分も出力させる。

  • VBAでタブ区切りテキストの保存に関して

    VBAでタブ区切りテキストの保存のプログラムを書くためには Application.DisplayAlerts = False Sheets("sheet01").Copy ActiveWorkbook.SaveAs Filename:="D:\test.txt", FileFormat:=xlText ActiveWindow.Close Application.DisplayAlerts = True という記述が一般的に使われます。 いま、あるプログラムでexcelシート上に title subtitle 001  002  003 333  444  555 666  777  888 ような内容が書き込まれたものをタブ区切りで出力したいのですが、 上記の方法で出力すると、 titleやsubtitleと書かれた行の右側にも空白のタブ区切りが一緒に保存されてしまいます。 あるプログラムで読み込ませるためには、 この二つの行のタブ区切りをいちいち消す必要があり、毎回手作業でするのは面倒です。 VBAでこのようなタブ区切りの有無を行ごとに指定して保存するようなことは可能でしょうか?

  • Dosブロンプトでtabを出力したい

    batファイルからテキストファイルにtab区切りのテキストを出力したいのですが、tabはどのように出力すればいいのでしょうか?普通に¥tとやっても、そのまま出てきてしまうのですが・・・ よろしくお願いします。

  • fortranでタブ区切り

    フォートランで出力する際,タブ区切りのテキスト形式は可能でしょうか?

  • メールアドレスのエクスポート

    メールアドレスのエクスポートのとき、ファイルの種類は テキストファイルでも4種類あります。 DOS,カンマ区切り DOS,タブ区切り Windows,カンマ区切り Windows,タブ区切り どれにすればいいのでしょうか。 (Microsoft outLook を使用) よろしくお願いします。