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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1125閲覧

ファイル名の一部で処理対象を絞りたいです。

TAKATAKA_

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/02/15 03:20

編集2021/02/15 04:48

開発は全くの初心者です。言語はc#です。
たくさん調べたのですが、いい方法がわからなかったので困っています。

ファイル処理のプログラムを作成しているのですが、例えば、入力フォルダに、
a_2021021501.txt
a_2021021502.txt
b_2021021503.txt
c_2021021504.txt
c_2021021505.txt
のような入力データがあった際、
二項目目の日付の最終のもののみを処理対象として処理対象として、
別なフォーマットに変換して出力フォルダに出力する処理に渡したいです。
どのようにすればよいでしょうか?
a_2021021502.txt
b_2021021503.txt
c_2021021505.txt
だけを対象にしたい。

知識不足で申し訳ございませんが、どなたかご教授の方よろしくお願いいたします。

下記のコードでは、全ファイルを作業フォルダに移動させることができますが、
やりたいことは、ファイル名を区切り文字"_"で区切った、一項目目に対して、二項目目を比較して、
ファイル名内の最終日付のものだけを対象に作業フォルダに移動させたいです。。

c#

1 2using System; 3using System.Collections.Generic; 4using System.IO; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8 9namespace Fileconvert 10{ 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 string filePath = @"c:\temp\"; 16 string wfilePath = @"c:\work"; 17 18 if (Directory.Exists(filePath)) 19 { 20 string[] files = System.IO.Directory.GetFiles(filePath, "*.txt", System.IO.SearchOption.TopDirectoryOnly); 21 for(int i=0;i<files.Length;i++) 22 { 23 string wData = Path.Combine(wfilePath, Path.Combine(Path.GetFileName(files[i]))); 24 if(!File.Exists(wData)) 25 { 26 File.Copy(files[i], wData); 27 } 28 else 29 { 30 File.Delete(wData); 31 File.Copy(files[i], wData); 32 } 33 } 34 } 35 36 } 37 } 38} 39

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cleaner

2021/02/15 03:35

提示頂いた全てのファイルを処理する方法は分かりますか? 分かる場合は全てのファイルを処理するコードを上げてもらえますか?
dodox86

2021/02/15 03:38

> たくさん調べたのですが、いい方法がわからなかったので困っています。 良い方法でなく、あまり良くないと思える方法でも良いからまず目的を実現できるコードを自力で書けるようにしましょう。今のままではどこまで自力でできるか読んだ者に分かりません。
退会済みユーザー

退会済みユーザー

2021/02/15 03:51

> 二項目目の日付の最終のもののみを処理対象として処理対象として、 > 別なフォーマットに変換して出力フォルダに出力する処理に渡したいです。 そこがそもそも意味不明です。
TAKATAKA_

2021/02/15 04:28

初心者で、ちょっとはずかしいのですが、今かけているところは上げますね。 このように、全ファイルを対象にして作業フォルダにコピーすることはできるのですが、 対象の絞り方が思いつきません・・。見苦しくて申し訳ありません。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Fileconvert { class Program { static void Main(string[] args) { string filePath = @"c:\temp\"; string wfilePath = @"c:\work"; if (Directory.Exists(filePath)) { string[] files = System.IO.Directory.GetFiles(filePath, "*.txt", System.IO.SearchOption.TopDirectoryOnly); for(int i=0;i<files.Length;i++) { string wData = Path.Combine(wfilePath, Path.Combine(Path.GetFileName(files[i]))); if(!File.Exists(wData)) { File.Copy(files[i], wData); } else { File.Delete(wData); File.Copy(files[i], wData); } } } } } }
cleaner

2021/02/15 04:35

そのコードを質問内に書いてください。 質問は編集可能ですので。
TAKATAKA_

2021/02/15 04:49

ありがとうございます。質問を再度編集してみました。 お手数おかけしてすみません。
guest

回答2

0

ベストアンサー

先の回答者様の回答を参考にして、Dictionaryを使うのも手かと思います。

Dictionaryを用意します。

filesに対してForでループさせます。

一つ一つのfileに対してSplit関数で1項目目と2項目目を分けます。

1項目目がDictonaryに登録されていなければ、1項目目をキー,2項目目を値として登録します。

1項目目が登録済みであれば、登録されている値と比較して大きい方を代入します。

最後に、Dictionaryの全項目に対して処理すればできると思います。

スマホからなのと、普段VBしか使わなくてC#のコードは正しく書けるか自信がないので手順だけとなりますがご容赦ください。

投稿2021/02/15 05:06

cleaner

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKATAKA_

2021/02/15 05:24

お世話になります。ぜんぜん頭が回らなかったので、手順だけ教えていただいても、 目から鱗でとても助かります。 そうですね。Dictionaryで処理できるよう調べて検討してみます! みなさん親切に教えていただいて、初めて質問してみたので大変感激しています。 最初に回答してくださったcleaner様ベストアンサーにしたいと思います。 ありがとうございました。
guest

0

仮にファイル名の一覧の絞り込みをshellでできるなら、こういう書き方もできます。
(mawkだとmatchの拡張機能が使えないので、書き換えないと動きません。)
処理の流れのご参考になれば幸いです。

1、ファイル一覧の取得。
2、先頭の2文字をキーとし、日付部分を値とするデータにする。
3、キーと値の組み合わせで、キー毎に値が一番最大のものを求める処理。
4、キーと値の組み合わせから、最終的なファイル名一覧に変換する。

shell

1ls *.txt | sort | \ 2gawk 'match($0,/([a-z]_)(.*).txt/,a) {print a[1],a[2]}' \ 3| \ 4gawk 'BEGIN{if(max[$1] == "") max[$1]="0"} \ 5{if(max[$1]<$2) max[$1]=$2} \ 6END{for(key in max) print key, max[key]}' \ 7| \ 8gawk '{print $1$2".txt"}'

投稿2021/02/15 04:55

編集2021/02/15 04:58
phoepsilonix

総合スコア233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKATAKA_

2021/02/15 05:27

お世話になります。 親切に回答して頂いて、ありがとうございます。 頭がまわらなかったので、考え方がとても参考になりました! 考え方がわかると物事がみえてくるようになるので、大変感激しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問