C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: C#で似たようなフォルダを削除したい


(過去ログ 171 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■98598 / inTopicNo.1)  C#で似たようなフォルダを削除したい
  
□投稿者/ ぽんちゃん (1回)-(2021/12/06(Mon) 21:56:28)

分類:[.NET 全般] 

C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
C:\effff1\effff2\uuu1\uuu2\uuu3\uuu4\uuu5\effff3\effff4\effff5\

ffff5、effff5のみにファイルが入っているとします。
同じようなフォルダ名がたくさんあるため、C#で、ffff5、effff5のみに
ファイルを入れた状態で、親と子で同じような名前のフォルダをまとめて、
以下のようになるようにしたいのですが、Directory.Moveなどを使ってもうまくいきません。

C:\ffff1\uuu1\ffff5\
C:\effff1\uuu5\effff5\

解決法はあるでしょうか。
引用返信 編集キー/
■98599 / inTopicNo.2)  Re[1]: C#で似たようなフォルダを削除したい
□投稿者/ くま (44回)-(2021/12/06(Mon) 23:23:53)
ん?
C:\ ffff1\ ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ ffff3\ ffff4\ ffff5\
C:\effff1\effff2\uuu1\uuu2\uuu3\uuu4\uuu5\effff3\effff4\effff5\
「\uuu1\uuu2\uuu3\uuu4\uuu5\」が同じだから
C:\ffff1\ffff2\ffff4\ffff5\
C:\effff1\effff2\effff3\effff4\effff5\
なら解かるけど

なんで
> C:\ffff1\uuu1\ffff5\
> C:\effff1\uuu5\effff5\
なの?
「同じようなフォルダ名」≒「同じフォルダ名」ではない気がするけど
多分質問の関係で略したんだろうけど判断つかないよ...

引用返信 編集キー/
■98604 / inTopicNo.3)  Re[1]: C#で似たようなフォルダを削除したい
□投稿者/ とっちゃん (752回)-(2021/12/07(Tue) 00:58:54)
No98598 (ぽんちゃん さん) に返信
> C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
> C:\effff1\effff2\uuu1\uuu2\uuu3\uuu4\uuu5\effff3\effff4\effff5\
>
> ffff5、effff5のみにファイルが入っているとします。
> 同じようなフォルダ名がたくさんあるため、C#で、ffff5、effff5のみに
> ファイルを入れた状態で、親と子で同じような名前のフォルダをまとめて、
> 以下のようになるようにしたいのですが、Directory.Moveなどを使ってもうまくいきません。
>
> C:\ffff1\uuu1\ffff5\
> C:\effff1\uuu5\effff5\
>
> 解決法はあるでしょうか。

C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
にあるファイルを
C:\ffff1\uuu1\ffff5\
に移動したいのですよね?

フォルダの決め方については書かれていることから類推することはできませんが
まとめたい先のフォルダを用意し、そこに「File.Move」で移動したいファイルを一つずつ移動したらどうでしょうか?



引用返信 編集キー/
■98616 / inTopicNo.4)  Re[1]: C#で似たようなフォルダを削除したい
□投稿者/ 古谷 (21回)-(2021/12/07(Tue) 20:32:36)
> C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
> C:\effff1\effff2\uuu1\uuu2\uuu3\uuu4\uuu5\effff3\effff4\effff5\
> C:\ffff1\uuu1\ffff5\
> C:\effff1\uuu5\effff5\

フォルダ名「ffff1」の「ffff」をプリフィクスと呼ぶことにすると
同じプリフィクスが並んでいるときにそれをユニークにするって感じですかね
その規則で考えると
C:\ffff1\uuu1\ffff3\
C:\effff1\uuu1\effff3\になりそうな気がしますが
フォルダ名の短縮だけでもプログラムの課題としてはなかなか面白いですねこれ

Directory.Moveがうまいくいかないのはなぜでしょうね、エラーとかなにか出てますか?

こんな感じでできるはず
https://paiza.io/projects/Ze-pp1lENjsYd5w7LtbYIQ
引用返信 編集キー/
■98620 / inTopicNo.5)  Re[2]: C#で似たようなフォルダを削除したい
□投稿者/ ぽんちゃん (3回)-(2021/12/07(Tue) 23:55:00)
返信いただいた方、ありがとうございます。

くまさん
 なんでと言われましても、そんな状況だからなんです。同じフォルダ名ではありません。わかりずらく、申し訳ございません。

とっちゃんさん
 法則性を認識させて、どのようにまとめたい先のフォルダを作成すればよいのかが、非常に困っているところです。

古谷さん
 フォルダ名を短縮したいというよりも、似たフォルダを削除し、フォルダの親子関係を少なくしたいです。例の提示ありがとうございました。移動先フォルダの名称を人力で決めるのではく、名称を推測し、自動で移動先のフォルダを作れるようになりたいです。
引用返信 編集キー/
■98621 / inTopicNo.6)  Re[3]: C#で似たようなフォルダを削除したい
□投稿者/ くま (52回)-(2021/12/08(Wed) 00:38:58)
たとえば「私は人間です」という単語があるとします。
他に
「わたしは人間です」
「わたしはニンゲンです」
「わたしはにんげんです」
「私は、人間です。」
「WATASI HA NINGEN DESU」
があるとします。
これぐらいまでは同じ単語として認識できます。
ただ
「I am human」
「私は人間です。男性です。」
「私は人間!」
を同じと判断して良いかは作る側が決めないといけません。

今私もちょうど取り組んでいるのですが
1. Excelの左側の列にフォルダ名をすべて書き出す

2. 右側の列には
・「記号空白」をすべて消す
・「カタカナ半角」はすべて「カタカナ全角」に変換
・「英数字全角」はすべて「英数字半角」に変換
・「英字小文字」はすべて「英字大文字」に変換
・「カタカナ全角」はすべて「ひらがな全角」に変換
・「漢字カナ変換」を行ってくれるサイトで漢字を変換
http://www.lsx.jp/converter/kana/index.html
・「ひらがな、ローマ字変換ツール」を行ってくれるサイトでローマ字表記に変換
https://hogehoge.tk/nihongo/

3. 結果上の例だとすべて「WATASIHANINGENDESU」になります。
これで対応表ができて「すべて同じ」と判断するわけです。

「わたしは人間です」→「WATASIHANINGENDESU」
「わたしはニンゲンです」→「WATASIHANINGENDESU」
「わたしはにんげんです」→「WATASIHANINGENDESU」
「私は、人間です。」→「WATASIHANINGENDESU」
「WATASI HA NINGEN DESU」→「WATASIHANINGENDESU」

で、「I am human」の場合だと日本語に変換とか入ってくるので
対応表で
「I am human」→「WATASIHANINGENDESU」
と追加しておけば良いのです。

いきなり対応表もなしでプログラムを動かしたら元に戻せませんし
事前に「このように変更する」という表を作成してから行わないとおかしな事になりますよ。

あと「あいまい検索」のアルゴリズムはありますが、どの程度まで同じと判断するかはやはり人間が行います
(すべて正しく一致できるのならGoogleの検索結果あんなに多くならないでしょ?)
推測できても「同じ」かどうかは自分で判断するしかないですよ。

「あいまい検索 アルゴリズム 日本語」で検索結果
簡単に高速なスペルチェックや補完が実装できる?!symspellの紹介
https://qiita.com/daimonji-bucket/items/1f40bc3242a3d26133d0
SymSpell対BK木:100倍速い文字列のあいまい検索とスペルチェック
https://postd.cc/symspell-vs-bk-tree-100x-faster-fuzzy-string-search-spell-checking/
類似文字列検索ライブラリResemblaを公開しました
https://engineering.linecorp.com/ja/blog/resembla-similar-string-search-library/

(※私はこのライブラリ理解して使えるようにする手間より、対応表を1万件分作った方が早いと思ったタイプです。)
引用返信 編集キー/
■98622 / inTopicNo.7)  Re[3]: C#で似たようなフォルダを削除したい
□投稿者/ ロッテモナ王 (5回)-(2021/12/08(Wed) 00:41:54)
No98620 (ぽんちゃん さん) に返信

あ、法則性わかった気がします
古谷さんの言葉を借りて「ffff1」の「ffff」をプリフィクスと言うことにすると
プリフィックスが同じフォルダが直接親子関係にある場合にそのうちのフォルダの一つをランダムに残してそれ以外を削除するってことですか?

引用返信 編集キー/
■98624 / inTopicNo.8)  Re[4]: C#で似たようなフォルダを削除したい
□投稿者/ くま (53回)-(2021/12/08(Wed) 01:51:45)
2021/12/08(Wed) 01:52:04 編集(投稿者)
大事な事書き忘れていました。
ぽんちゃんさんはこのフォルダの整理を
a1. 1回のみ行うだけ
a2. 定期的に行う

またこのフォルダを作っている人は
b1. 不特定多数が利用するサーバ
b2. 会社・大学・等何の団体に所属するサーバ
b3. 不特定多数が利用するPC
b4. 今後ぽんちゃんさんだけが利用するPC(サーバ)

どれに該当しますか?

先に書きましたが大変面倒な処理です。
どれに該当するかによって.netで作る労力よりも既存のフリーソフト等を使った方が
手間が少なく済む場合があります。

あとできればで構いませんもう少し具体的な単語にできませんか?
例えば、こうしたいけど
ヒト科
 ヒト属
  ホモ・サピエンス
     ホモ・サピエンス・サピエンス

実際はこんな感じとか
人
 ヒト属
  ホモサピエンス
     Homo sapiens sapiens

引用返信 編集キー/
■98625 / inTopicNo.9)  Re[3]: C#で似たようなフォルダを削除したい
□投稿者/ とっちゃん (753回)-(2021/12/08(Wed) 01:59:07)
No98620 (ぽんちゃん さん) に返信
>  法則性を認識させて、どのようにまとめたい先のフォルダを作成すればよいのかが、非常に困っているところです。
>
>  フォルダ名を短縮したいというよりも、似たフォルダを削除し、フォルダの親子関係を少なくしたいです。例の提示ありがとうございました。移動先フォルダの名称を人力で決めるのではく、名称を推測し、自動で移動先のフォルダを作れるようになりたいです。


まずは「似た」部分というあいまいさではなく、一意に決めることができる「規則性」を導き出す必要があります。

最初の例をもとに、変更前と変更後の関係から導き出せる規則性を考えてみましょう。
それぞれ以下のパターンで変換したいとありました。

C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\

C:\ffff1\uuu1\ffff5\

C:\effff1\effff2\uuu1\uuu2\uuu3\uuu4\uuu5\effff3\effff4\effff5\

C:\effff1\uuu5\effff5\

この変換結果から導き出せる規則性は一意ではありませんが(プログラムとして確実性がない)
ある程度は規則が見えています。

なのでまずはプログラムとしてどうするかを考える前に、どういう規則で移動先フォルダ名を決めるか?を
作るところから考えることをお勧めします。

具体的には

1. 移動元のフォルダ名をテキストエディタに貼る
2. ドライブ部分を削除する
3. '\'をスペースで置き換える
4. グループにする単位ごとに改行する

とそこまでやってみることをお勧めします。
具体的には以下のような感じ(最初のデータで表現)

1.
C:\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
2.
\ffff1\ffff2\uuu1\uuu2\uuu3\uuu4\uuu5\ffff3\ffff4\ffff5\
3.
ffff1 ffff2 uuu1 uuu2 uuu3 uuu4 uuu5 ffff3 ffff4 ffff5
4.
ffff1 ffff2
uuu1 uuu2 uuu3 uuu4 uuu5
ffff3 ffff4 ffff5

実際に移動したいフォルダを人力でグループ化してみることでどういう風にすればいいかを考えることができると思います。
4まで分類出来たら、フォルダ階層数は出てくると思います。
それであっているか?を考えあっているなら、グループになっている文字列のどれをパスとして残すか?のルールを決めれば
実際にプログラムにすることができると思います。

引用返信 編集キー/
■98644 / inTopicNo.10)  Re[5]: C#で似たようなフォルダを削除したい
□投稿者/ ぽんちゃん (4回)-(2021/12/09(Thu) 23:46:39)
回答くださった方、ありがとうございます。

くまさん
 対応表、考えてみます。

 a3. 数年に1回程度定期的に行う
 b3. 不特定多数が利用するPC
 です。

 既存のフリーソフトでいいのが見つかればいいのですが、見つかりません。

ロッテモナ王さん
 指摘いただいたことをしたいです。

とっちゃんさん
 ルール決め、頑張ってみます。
引用返信 編集キー/
■98645 / inTopicNo.11)  Re[6]: C#で似たようなフォルダを削除したい
□投稿者/ くま (57回)-(2021/12/10(Fri) 09:16:17)
> a3. 数年に1回程度定期的に行う
> b3. 不特定多数が利用するPC
これは管理大変そうですね...
Windowsの標準機能でフォルダにセキュリティを設定してその人(ログインユーザで判断)だけしか書き込みができない様にする事ができるのですが
そういう方法も取れなさそうですね...

会社なんかだと
「A支部」
 「A支部共通」
 「a課」
  「a課共通」
  「あ.さん」
  「い.さん」
  「う.さん」
 「b課」
  「b課共通」
  「え.さん」
  「お.さん」
「B支部」
 「c課」
...
という感じで作成しておいて
『A支部・a課・あ.さん』は「a課共通」「あ.さん」フォルダにしか書き込みできない
「A支部共通」は見る事はできるが書き込むことや削除はできない。
なような設定ができます。

また
「電化製品」
 「冷蔵庫」
  「型番A」
   「かんたんマニュアル」
   「マニュアル」
   「こまった場合用マニュアル」
  「型番B」
   「かんたんマニュアル」
   「マニュアル」
   「こまった場合用マニュアル」

などの場合フォルダを作るルールを厳密化させて
専用ソフトを作ってそのソフトでしか書き込みしないようにするとか
書き込み自体をオペレータ一人だけにして「依頼して書き込んでもらう」とかの方法があります。

数年とはいえ毎回だと大変ですね...。
引用返信 編集キー/
■98646 / inTopicNo.12)  Re[7]: C#で似たようなフォルダを削除したい
□投稿者/ くま (58回)-(2021/12/10(Fri) 09:16:54)
2021/12/10(Fri) 09:22:43 編集(投稿者)

まず「ファイルリスト作成」ソフトで一覧表を作成してみてください。
ファイルリスト作成
https://www.gigafree.net/utility/listing/

一覧表はできればTSV(タブ区切りCSV)形式で出力できる
「Put File List」辺りが良いかと

表の上でしたら間違えても問題ありません。

これがとっちゃんさんの書かれている
> 1. 移動元のフォルダ名をテキストエディタに貼る
に該当します。

> 2. ドライブ部分を削除する
ここにもう一つ
2.5 対象外のフォルダ階層の情報は削除する
これは例えば
[フォルダ1]
 [フォルダ2]
  [フォルダ3]
   [*フォルダ4-1]
   [*フォルダ4-2]
とあって[フォルダ3]以降は何が入っていても変更しないとするなら
   [*フォルダ4-1]
   [*フォルダ4-2]
が書かれているパスは消す事ができます
結果
[フォルダ1]
 [フォルダ2]
  [フォルダ3]
こうなります

あとは
> 3. '\'をスペースで置き換える
> 4. グループにする単位ごとに改行する

今回の事案でテキストの自動分類ができないか調べていたのですが
「テキスト自動分類」
https://text-classification.userlocal.jp/
これぐらいしか見つける事ができませんでした。

あと判断できるのは「フォルダ内に1フォルダしか存在しない場合は消す事とする」という事ですかね
これは
[フォルダ1]
 [フォルダ2]
  [フォルダ3-1]
   [フォルダ4]
    [フォルダ5-1]
    [フォルダ5-2]
  [フォルダ3-2]
...
この様な構成だった場合
[フォルダ1]には[フォルダ2]一つなので[フォルダ2]が消せます
同じく[フォルダ3-1]には[フォルダ4]一つなので[フォルダ4]が消せます
結果
[フォルダ1]
 [フォルダ3-1]
  [フォルダ5-1]
  [フォルダ5-2]
 [フォルダ3-2]
...
となります。

ただ
[フォルダ1]
 [フォルダ2]
 「ファイル1」
  [フォルダ3-1]
...
のように[フォルダ1]の中に[フォルダ2]「ファイル1」のように2つが入っていた場合
[フォルダ2]を消す事をしません。
※消してもいいのですがなぜ「ファイル1」がそこにあるかはわからないと思います。問題なければ消してもいいです。

これなら文字のルールではないのでプログラム化する事は可能です。
引用返信 編集キー/
■98647 / inTopicNo.13)  Re[6]: C#で似たようなフォルダを削除したい
□投稿者/ ロッテモナ王 (8回)-(2021/12/10(Fri) 13:19:19)
無作為に選んでよいならこんな感じ
https://paiza.io/projects/r1yYC2ZfYQFrlTewZ_GVaw
引用返信 編集キー/
■98654 / inTopicNo.14)  Re[7]: C#で似たようなフォルダを削除したい
□投稿者/ ぽんちゃん (5回)-(2021/12/11(Sat) 08:50:14)
くまさん
 詳細な解説、ありがとうございました。色々試してみようと思います。

ロッテモナ王さん
 例を作成いただき、ありがとうございました。IEnumerableなどは初心者には解読が難しいので、時間をかけて解読します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -