質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Excel

    1467questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • 秀丸マクロ

    3questions

    秀丸マクロは、Windowsで使用可能なテキストエディタである秀丸エディタのマクロ及びマクロ言語を指します。標準にはない機能や、処理・作業といった作業の繰り返しを実現することが可能です。

複数のテキストファイルから重複した行を削除する方法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,408

oshigotoDacho

score 43

急ぎにつき乱文失礼します。

複数のテキストファイルから、重複している行を削除し、一意にしたいのですが、どのような方法があるでしょうか?
例としては以下になります。

・テキストファイルA.txt
あああ あああ
いいい いいい
ううう ううう

・テキストファイルB.txt
あああ あああ
いいい おおお
えええ えええ

この内、両ファイルで重複している「あああ あああ」の行を片方削除したいです。
また、「いいい いいい」と「いいい おおお」の行は一部文字列が異なりますが、これも重複行としてカウントし、片方削除したいです。

よろしくお願いします。

追記です
>また、「いいい いいい」と「いいい おおお」の行は一部文字列が異なりますが、これも重複行としてカウントし、片方削除したいです。
これについての重複と判断するルールです。
以下のようにコロンで区切られていて前半だけ一致して後半が一致していない場合でも重複としてカウントしたいです。
いいい:いいい
いいい:おおお

ただし、以下のようにコロンで区切られた文字が2~7組で可変する可能性があります。
これらを全て重複としてカウントしたいです。
いいい:いいい
いいい:いいい:おおお
いいい:いいい:えええ:おおお

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/01/10 11:04

    両方のファイルの内容を、Excelの2枚のシートに入れて、match関数などで重複を探す方法が使えそうな気がします。但し、「いいい いいい」と「いいい おおお」を重複と見なすといった特殊な判断には既存の関数で対応できないかもしれません。(重複と判断するルールが明記されていないので、検討することが出来ません)

    キャンセル

  • oshigotoDacho

    2017/01/10 11:14

    ありがとうございます。重複のルールについて追記しました

    キャンセル

  • ikedas

    2017/01/10 13:58

    重複している場合、どちらのファイルにある行を削除しますか (前、後、どちらでもいい、その他)。また、重複削除したあとの行はどういう順序で並べればいいですか (ソートする、どうでもいい、その他)。

    キャンセル

  • oshigotoDacho

    2017/01/10 14:05

    ご返信ありがとうございます。削除する行は後、削除したあとの順序はとくに指定はありません

    キャンセル

回答 4

checkベストアンサー

0

「ファイルAとBをつなげたものから、:以前が同じものを重複として2つ目以降を削除する」
ということでいいでしょうか?

  1. ExcelのA列にファイルAとファイルBの行を順番に入れていきます。
  2. A列をコピーしてB列を作ります。
  3. B列を、データ→区切り位置で、区切り文字を:にして区切ります。
  4. C列以降を削除します。
  5. データ→重複の削除で、B列を対象にして、重複行を削除します。
  6. B列を消します。
    以上

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/10 14:06

    ありがとうございます。やってみます。

    キャンセル

  • 2017/01/10 14:37

    『:以前が同じものを重複として』では、「いいい いいい」と「いいい おおお」が重複しない事になってしまいますから、ダメなのではないでしょうか?

    キャンセル

  • 2017/01/10 23:06

    coco_bauerさん
    空白区切りは単なる例で、実際にやりたいのはコロン区切りですよ。質問文の追記の部分を見てください。

    キャンセル

  • 2017/01/11 11:16

    ありがとうございます。:で区切るのが正解です。空欄になっているのは間違いです。すいません。

    キャンセル

  • 2017/01/11 11:17

    otnに質問なのですが、A列をコピーしてB列を作るのは何故でしょうか?

    キャンセル

  • 2017/01/11 17:13

    B列は分解されて、最初のコロンの左側しか残らないので、元のデータをA列にそのまま残しておくためです。
    やってみればわかると思うのですが、やってないのですか?

    キャンセル

  • 2017/01/11 18:05

    otnさんご回答ありがとうございます。ちょっと色々と立て込んでいてすぐに試せない状況です。あとで試させていただきます。それと一つ前の返信で敬称が抜けていました。大変失礼いたしました。

    キャンセル

  • 2017/01/16 08:59

    otnさんの方法でできました。ありがとうございました。他の皆さんも貴重なお時間をとっていただきありがとうざいました。

    キャンセル

0

秀丸マクロを書いたことがないので (キー操作の記録・再生しか使ったことがない)、実際の関数名などがよくわかりませんが、次のようなことをすればできるのではないでしょうか。

最初のファイルを「1.txt」、2つめを「2.txt」とします。

"1.txt" にフォーカスを移す;
テキストの一番最初に移動;
while (カーソルがファイル末尾にない) {
    ワード選択;                     // 行頭から最初の ":" か空白の直前までを選択
    if (何か選択されている) {
        コピー;
        "2.txt" にフォーカスを移す。
        「"^" + クリップボードの内容 + "([: ].*)?\n"」としてできる正規表現にマッチするものをすべて "" に置換する;
        "1.txt" にフォーカスを移す;
    }
    論理行末に移動; カーソル右移動; // 次の論理行の行頭に移動
}

終了した時点で、2.txtの中の1.txtと重複する行が全て取り除かれているはずです (なお、1.txt自身の中に互いに重複する行があっても、取り除かれません)。

「ワード選択」の箇所は、フィールドにひらがなしか含まないという前提ですが、数字なども混在するのならうまくいかないかもしれません。工夫して下さい。また、フィールドに正規表現のメタキャラクタが含まれ得るのなら、正規表現を作るところではエスケープする必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/11 11:15

    ありがとうございます。試してみます。

    キャンセル

0

複数区切りの重複判定について

Aファイルに「いいい:ううう」がある場合、Bファイルに「いいい:かかか」があれば重複とみなすと思いますが、「さささ:いいい:すすす」のように複数区切りの途中にあるものは重複とみなしますか?

今回は複数区切りされている場合でも先頭の文字列でのみ重複の判断をする(上記例では「さささ」として扱う)ものとしてアドバイスさせていただきます。
この前提条件に誤りがありましたらその旨ご連絡ください。

対応案

①まず、テキストファイルの内容をそのままエクセルに貼り付けます。

A列
================================
あああ:あああ                  ←Aファイル
いいい:いいい
ううう:ううう
あああ:あああ                  ←Bファイル
いいい:おおお
えええ:えええ
いいい:いいい                  ←複数区切り重複サンプル
いいい:いいい:おおお
いいい:いいい:えええ:おおお

②B列に区切り文字以前の文字列を抽出します。
B1セルに式=MID(A1,1,FIND(":",A1)-1)を記述し、必要な行数までコピーします。

A列                                 B列
============================================
あああ:あああ                      あああ
いいい:いいい                      いいい
ううう:ううう                      ううう
あああ:あああ                      あああ
いいい:おおお                      いいい
えええ:えええ                      えええ
いいい:いいい                      いいい
いいい:いいい:おおお              いいい
いいい:いいい:えええ:おおお      いいい

②C列で重複の判定をします。
C1セルに式=IF(COUNTIF(B$1:B1,B1)=1,"o","x")を記述し、必要な行数までコピーします。

A列                                 B列     C列
====================================================
あああ:あああ                      あああ  o
いいい:いいい                      いいい  o
ううう:ううう                      ううう  o
あああ:あああ                      あああ  x
いいい:おおお                      いいい  x
えええ:えええ                      えええ  o
いいい:いいい                      いいい  x
いいい:いいい:おおお              いいい  x
いいい:いいい:えええ:おおお      いいい  x

④C列がxの行を削除すればA列に目的のデータだけが残ります。

今回の方法はあくまで一例で他にも実現手段はありますが、Excel関数だけでできる簡単そうなものを紹介してみました。
参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/11 11:15

    ありがとうございます。試してみます。

    キャンセル

0

ruby で作ってみました。

a.rb

lines = ARGV.map{|file| File.readlines(file) }.flatten!
lines.uniq! { |line| line.split(':')[0] }
puts lines

実行例です。
a.txt

あああ: あああ
いいい: いいい
ううう: ううう

b.txt

あああ: あああ
いいい: おおお
えええ: えええ
いいい: いいい
いいい: いいい:おおお
いいい: いいい:えええ:おおお
$ ruby a.rb a.txt b.txt
あああ: あああ
いいい: いいい
ううう: ううう
えええ: えええ

コマンドラインの引数は、2つのファイル名だけでなく、いくつでもファイル名を指定できます。指定されたファイルすべてから重複を除いた結果を表示します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Excel

    1467questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • 秀丸マクロ

    3questions

    秀丸マクロは、Windowsで使用可能なテキストエディタである秀丸エディタのマクロ及びマクロ言語を指します。標準にはない機能や、処理・作業といった作業の繰り返しを実現することが可能です。