複数のテキストファイルから重複した行を削除する方法
- 評価
- クリップ 0
- VIEW 4,444
急ぎにつき乱文失礼します。
複数のテキストファイルから、重複している行を削除し、一意にしたいのですが、どのような方法があるでしょうか?
例としては以下になります。
・テキストファイルA.txt
あああ あああ
いいい いいい
ううう ううう
・テキストファイルB.txt
あああ あああ
いいい おおお
えええ えええ
この内、両ファイルで重複している「あああ あああ」の行を片方削除したいです。
また、「いいい いいい」と「いいい おおお」の行は一部文字列が異なりますが、これも重複行としてカウントし、片方削除したいです。
よろしくお願いします。
追記です
>また、「いいい いいい」と「いいい おおお」の行は一部文字列が異なりますが、これも重複行としてカウントし、片方削除したいです。
これについての重複と判断するルールです。
以下のようにコロンで区切られていて前半だけ一致して後半が一致していない場合でも重複としてカウントしたいです。
いいい:いいい
いいい:おおお
ただし、以下のようにコロンで区切られた文字が2~7組で可変する可能性があります。
これらを全て重複としてカウントしたいです。
いいい:いいい
いいい:いいい:おおお
いいい:いいい:えええ:おおお
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
「ファイルAとBをつなげたものから、:
以前が同じものを重複として2つ目以降を削除する」
ということでいいでしょうか?
- ExcelのA列にファイルAとファイルBの行を順番に入れていきます。
- A列をコピーしてB列を作ります。
- B列を、データ→区切り位置で、区切り文字を
:
にして区切ります。 - C列以降を削除します。
- データ→重複の削除で、B列を対象にして、重複行を削除します。
- B列を消します。
以上
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
秀丸マクロを書いたことがないので (キー操作の記録・再生しか使ったことがない)、実際の関数名などがよくわかりませんが、次のようなことをすればできるのではないでしょうか。
最初のファイルを「1.txt」、2つめを「2.txt」とします。
"1.txt" にフォーカスを移す;
テキストの一番最初に移動;
while (カーソルがファイル末尾にない) {
ワード選択; // 行頭から最初の ":" か空白の直前までを選択
if (何か選択されている) {
コピー;
"2.txt" にフォーカスを移す。
「"^" + クリップボードの内容 + "([: ].*)?\n"」としてできる正規表現にマッチするものをすべて "" に置換する;
"1.txt" にフォーカスを移す;
}
論理行末に移動; カーソル右移動; // 次の論理行の行頭に移動
}
終了した時点で、2.txtの中の1.txtと重複する行が全て取り除かれているはずです (なお、1.txt自身の中に互いに重複する行があっても、取り除かれません)。
「ワード選択」の箇所は、フィールドにひらがなしか含まないという前提ですが、数字なども混在するのならうまくいかないかもしれません。工夫して下さい。また、フィールドに正規表現のメタキャラクタが含まれ得るのなら、正規表現を作るところではエスケープする必要があります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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関数だけでできる簡単そうなものを紹介してみました。
参考になれば幸いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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で質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
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
ご返信ありがとうございます。削除する行は後、削除したあとの順序はとくに指定はありません