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

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

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

Re[7]: ファイルの読み込みとcsvの書き込みのロジック


(過去ログ 173 を表示中)

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

■99409 / inTopicNo.1)  ファイルの読み込みとcsvの書き込みのロジック
  
□投稿者/ 考える人 (1回)-(2022/03/30(Wed) 12:22:37)

分類:[C#] 

Visual Studio2019のWindowsフォームアプリケーションで
データをまとめてcsvにするアプリを作っています。

ファイルの読み込みとcsvの書き込みのロジックが思いつかないので相談させてください。

フォルダ内に数十件のテキストファイルがあります。(100件以下、一番重いのでも10KBは超えません)
ファイル名は固定文字_数字_英数字@_英数字A.txtが基本の形です。例:A_12345678_ABC123_123abc.txt
しかし中には
A_12345678_ABC123_123abc.1.txt ファイル名の最後に英数字Aに対しての枝番が付いているファイル
A__ABC123_123abc.txt 数字がないファイル
などもあります。

これをCSVに書き込む時に
英数字@ | 数字 | 英数字Aのファイルの中の値1 | 英数字Aのファイルの中の値2 | 数字と英数字@が同じファイルの英数字Aのファイルの中身 | 数字と英数字@が同じファイルの英数字Aのファイルの中身...
例:ABC123,12345678,OK,300,NG,12, ....
数字と英数字@の2つが同じファイルがある限りcolumnを増やします。

そして枝番が付いたものはその下の行に追加します。
英数字@ | 数字 | 英数字Aのファイルの中の値1 | 英数字Aのファイルの中の値2 | ...
英数字@ | 数字 | 英数字Aの枝番1のファイルの中の値1 | 英数字Aの枝番1のファイルの中の値2 | ...
英数字@ | 数字 | 英数字Aの枝番2のファイルの中の値1 | 英数字Aの枝番2のファイルの中の値2 | ...

枝番ファイルは英数字@と数字の箇所は空白でも問題ありません。

↓イメージです。 項目ごとにファイルを別にしていると考えて下さい。
型名  | シリアル | 項目1結果 | 項目1値 | 項目2結果 | 項目2値 | 項目3結果 | 項目3値 |...
ABC123 | 12345678 | NG | 10 | OK | 100 | NG | 10 |...←枝番なし
| | OK | 100 | | | OK | 100 |...←枝番がついてるファイル

ロジックが思いつきません。
どういう順番でどういった処理をしたらいいでしょう?

ちなみに項目名には順番があり、今後増減する可能性があるので別途csvに項目名を記載して、Regex.Matchで順に処理しようと考えています。

よろしくお願いします。


引用返信 編集キー/
■99414 / inTopicNo.2)  Re[1]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ くま (187回)-(2022/03/30(Wed) 21:35:43)
なんかややこしい処理ですね(笑)
問題整理しましょう。
>A_12345678_ABC123_123abc.1.txt ファイル名の最後に英数字Aに対しての枝番が付いているファイル
A_12345678_ABC123_123abc.10.txtなど枝番が2桁以上の場合があるのか?

>A__ABC123_123abc.txt 数字がないファイル
数字はtxtファイル内の項目に存在するのか?
また数字がないファイルにも枝番が存在するのか?

>数字と英数字@の2つが同じファイルがある限りcolumnを増やします。
ファイル自体の読み込み順番は?
例1.
A_1000000_ABC123_123abc.txt
A_2000000_ABC123_123abc.txt
A_3000000_ABC123_123abc.txt
B_1100000_ABC123_123abc.txt

例2.
A_1000000_ABC123_123abc.txt
B_1100000_ABC123_123abc.txt
A_2000000_ABC123_123abc.txt
A_3000000_ABC123_123abc.txt

その辺りをまず「どういった順番でtxtファイルを読み込むのが正しいのか」整理して
配列にファイルを読み込む順番にパスを入れておきます。

あとはCSV用の配列にルールに従って書き込めばよいのです。

※配列と書いていますが
List<>
Dictionary
などを組み合わせて使ってください。

引用返信 編集キー/
■99415 / inTopicNo.3)  Re[1]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ radian (26回)-(2022/03/31(Thu) 09:26:22)
> ↓イメージです。 項目ごとにファイルを別にしていると考えて下さい。
> 型名  | シリアル | 項目1結果 | 項目1値 | 項目2結果 | 項目2値 | 項目3結果 | 項目3値 |...
> ABC123 | 12345678 | NG | 10 | OK | 100 | NG | 10 |...←枝番なし
> | | OK | 100 | | | OK | 100 |...←枝番がついてるファイル
>
> ロジックが思いつきません。
> どういう順番でどういった処理をしたらいいでしょう?
>
> ちなみに項目名には順番があり、今後増減する可能性があるので別途csvに項目名を記載して、Regex.Matchで順に処理しようと考えています。

入出力ロジック自分で思いつかない時点で、なんかデータ構造そのものを見直した方がいいと思いますけどね。
まずカラム増減させる必要あります?イメージからすると、

型名|シリアル|項目のキー|枝番|項目の結果|項目の値

でいいんじゃないですか?
項目の増減ある度にカラムの数変動してたら扱うの面倒でしょう。
引用返信 編集キー/
■99416 / inTopicNo.4)  Re[2]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 考える人 (2回)-(2022/03/31(Thu) 12:31:00)
No99414 (くま さん) に返信
> なんかややこしい処理ですね(笑)
> 問題整理しましょう。
> >A_12345678_ABC123_123abc.1.txt ファイル名の最後に英数字Aに対しての枝番が付いているファイル
> A_12345678_ABC123_123abc.10.txtなど枝番が2桁以上の場合があるのか?

あります。

> >A__ABC123_123abc.txt 数字がないファイル
> 数字はtxtファイル内の項目に存在するのか?
> また数字がないファイルにも枝番が存在するのか?

ファイル内には枝番は存在しません。

> >数字と英数字@の2つが同じファイルがある限りcolumnを増やします。
> ファイル自体の読み込み順番は?

A_1000000_ABC123_123abc.txt
A_1000000_ABC123_456abc.txt
A_1000000_ABC123_789abc.txt
A_2000000_ABC123_123abc.txt
のよな順番になります。


> あとはCSV用の配列にルールに従って書き込めばよいのです。
>
> ※配列と書いていますが
> List<>
> Dictionary
> などを組み合わせて使ってください。

List<>とDictionaryの組み合わせですか。
すぐには思いつかないのですが、すこし考えてみます。
引用返信 編集キー/
■99421 / inTopicNo.5)  Re[2]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ ???? (5回)-(2022/03/31(Thu) 20:41:33)
2022/03/31(Thu) 20:48:10 編集(投稿者)

訂正
引用返信 編集キー/
■99422 / inTopicNo.6)  Re[3]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ くま (188回)-(2022/03/31(Thu) 20:48:29)
微妙に違うように伝わってる気がする
> > >A__ABC123_123abc.txt 数字がないファイル
> > 数字はtxtファイル内の項目に存在するのか?
> > また数字がないファイルにも枝番が存在するのか?

> ファイル内には枝番は存在しません。
質問が2つで
1. A__ABC123_123abc.txt 数字がないファイル
の場合対応する数字がtxtファイル内に存在しますか?
2. A__ABC123_123abc.1.txt 数字がないファイル
のような数字がないファイルにも枝番が存在しますか?

> > >数字と英数字@の2つが同じファイルがある限りcolumnを増やします。
> > ファイル自体の読み込み順番は?
> A_1000000_ABC123_123abc.txt
> A_1000000_ABC123_456abc.txt
> A_1000000_ABC123_789abc.txt
> A_2000000_ABC123_123abc.txt
> のよな順番になります。
英数字@ は並び順に関係しますか?

読み込み順を考えるとまず普通のテキストファイルは
A_1000000_ABC123_123abc.txt
→「A_1000000_ABC123_123abc.0000」枝番0を4桁変換
枝番有りなら
A_1000000_ABC123_123abc.1.txt
→「A_1000000_ABC123_123abc.0001」枝番1で4桁変換

数字がない場合、テキストファイル内に記載があるなら
※数字が9000000の場合
A__ABC123_123abc.txt
→「A_9000000_ABC123_123abc.0000」枝番0で4桁変換
枝番有りなら
A__ABC123_123abc.1.txt
→「A_9000000_ABC123_123abc.0001」枝番1で4桁変換

この形のすれば文字列の並べ替えで順番に取得できるでしょ?

自動でキーをソートしてくれるSortedDictionary
https://resanaplaza.com/%E3%80%90c%E3%80%91dictionary%E3%81%AF1%E7%A8%AE%E9%A1%9E%E3%81%A0%E3%81%91%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%EF%BC%81%E7%94%A8%E9%80%94%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E4%BD%BF%E3%81%84/#SortedDictionary


引用返信 編集キー/
■99423 / inTopicNo.7)  Re[3]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 伝説のカレー (1回)-(2022/03/31(Thu) 21:00:45)
No99416 (考える人 さん) に返信

型名,シリアル,枝番 でグルーピングすれば良い気がします
こんな感じで
https://paiza.io/projects/1kxazJNDMOAWl_CzK0Fbjw
引用返信 編集キー/
■99427 / inTopicNo.8)  Re[4]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 考える人 (3回)-(2022/04/03(Sun) 15:45:51)
No99422 (くま さん) に返信
>>ファイル内には枝番は存在しません。
> 質問が2つで
> 1. A__ABC123_123abc.txt 数字がないファイル
> の場合対応する数字がtxtファイル内に存在しますか?
> 2. A__ABC123_123abc.1.txt 数字がないファイル
> のような数字がないファイルにも枝番が存在しますか?

回答の仕方が悪かったです。申し訳ありません。

ファイルの中には123abcの部分だけが記載されています。
A、ABC123、枝番は記載されていません。123abcの部分だけがファイル内に存在しています。

> 英数字@ は並び順に関係しますか?

将来的にどうするかは考えていませんが、今現在はA以外は存在しません。
なので英数字@での並び順は関係ないと思ってください。

自分の質問の仕方も悪かったのえすが、なんなら英数字@の存在は忘れてもらって構いません。

> 読み込み順を考えるとまず普通のテキストファイルは
> A_1000000_ABC123_123abc.txt
> →「A_1000000_ABC123_123abc.0000」枝番0を4桁変換
> 枝番有りなら
> A_1000000_ABC123_123abc.1.txt
> →「A_1000000_ABC123_123abc.0001」枝番1で4桁変換
>
> 数字がない場合、テキストファイル内に記載があるなら
> ※数字が9000000の場合
> A__ABC123_123abc.txt
> →「A_9000000_ABC123_123abc.0000」枝番0で4桁変換
> 枝番有りなら
> A__ABC123_123abc.1.txt
> →「A_9000000_ABC123_123abc.0001」枝番1で4桁変換
>
> この形のすれば文字列の並べ替えで順番に取得できるでしょ?

なるほど、一旦枝番を4桁に変換するのは思いつきませんでした。
これで少し進められる気がします。
ありがとうございました。

伝説のカレーさんもありがとうございます。

いったんは解決済みにしますが、
すぐに息詰まる気がしますので、またよろしくお願いします。
解決済み
引用返信 編集キー/
■99429 / inTopicNo.9)  Re[5]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 考える人 (4回)-(2022/04/03(Sun) 23:38:44)
No99427 (考える人 さん) に返信
> ■No99422 (くま さん) に返信
> >>ファイル内には枝番は存在しません。
>>質問が2つで
>>1. A__ABC123_123abc.txt 数字がないファイル
>>の場合対応する数字がtxtファイル内に存在しますか?
>>2. A__ABC123_123abc.1.txt 数字がないファイル
>>のような数字がないファイルにも枝番が存在しますか?
>
> 回答の仕方が悪かったです。申し訳ありません。
>
> ファイルの中には123abcの部分だけが記載されています。
> A、ABC123、枝番は記載されていません。123abcの部分だけがファイル内に存在しています。
>
>>英数字@ は並び順に関係しますか?
>
> 将来的にどうするかは考えていませんが、今現在はA以外は存在しません。
> なので英数字@での並び順は関係ないと思ってください。
>
> 自分の質問の仕方も悪かったのえすが、なんなら英数字@の存在は忘れてもらって構いません。
>
>>読み込み順を考えるとまず普通のテキストファイルは
>>A_1000000_ABC123_123abc.txt
>>→「A_1000000_ABC123_123abc.0000」枝番0を4桁変換
>>枝番有りなら
>>A_1000000_ABC123_123abc.1.txt
>>→「A_1000000_ABC123_123abc.0001」枝番1で4桁変換
>>
>>数字がない場合、テキストファイル内に記載があるなら
>>※数字が9000000の場合
>>A__ABC123_123abc.txt
>>→「A_9000000_ABC123_123abc.0000」枝番0で4桁変換
>>枝番有りなら
>>A__ABC123_123abc.1.txt
>>→「A_9000000_ABC123_123abc.0001」枝番1で4桁変換
>>
>>この形のすれば文字列の並べ替えで順番に取得できるでしょ?

なるほど、一旦枝番を4桁に変換するのは思いつきませんでした。

この最後の枝番なしや枝番はどうやって判定して、抜き出して、書き換えればいいのでしょうか?
string.Formatで4桁にするのは思いつくのですが。。。

引用返信 編集キー/
■99430 / inTopicNo.10)  Re[6]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 伝説のカレー (2回)-(2022/04/04(Mon) 02:56:23)
No99429 (考える人 さん) に返信

正規表現を使うのが良いと思います
https://paiza.io/projects/aUSoU3e8WgY7cWF0MFl6tg
引用返信 編集キー/
■99431 / inTopicNo.11)  Re[7]: ファイルの読み込みとcsvの書き込みのロジック
□投稿者/ 考える人 (5回)-(2022/04/04(Mon) 12:37:23)
No99430 (伝説のカレー さん) に返信
> ■No99429 (考える人 さん) に返信
>
> 正規表現を使うのが良いと思います
> https://paiza.io/projects/aUSoU3e8WgY7cWF0MFl6tg

伝説のカレーさん、くまさん、ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -