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

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

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

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

解決済

C# フォルダ内の複数のdatファイル内から必要なキーを抽出し1つのCSVファイルにリストとして書き出す

ShinyaKojima
ShinyaKojima

総合スコア0

C#

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

2回答

0評価

0クリップ

64閲覧

投稿2019/04/03 09:01

前提・実現したいこと

初めて質問致します。至らない点があれば申し訳ございません。

最近C#を勉強し始めた初心者です。
表題の通り、あるフォルダ内にある複数のdatファイルの中から必要なキーを抽出してそれをまとめたCSVファイルを作成したいと考えています。
別の所で質問をして[Nugetパッケージの管理]から CsvHelper をインストール。

複数ファイルを読み込んで書き出し用リストに突っ込めば出来る
という風に教えていただいたのですが。
使い方を自分なりに調べてみましたがなかなか理解できず使いこなせていない状態です。
絶対パスで@"C:\検証用\検証データ\MLOG_RCVの中にワイルドカードでdatファイルを全て読み込もうとして@"C:\検証用\検証データ\MLOG_RCV*.datのようにしたのですがハンドルされていない例外というエラーが発生しました。自分なりに調べて*が無効な文字ということは分かったのですが、この場合全てのファイルを読み込むためにはどのように書いたら良いのか分かりません。
下記のソースコードも殆ど理解できていないままなので間違いだらけかもしれません。

datファイルの中身は以下のようになっておりフォルダ内に数万件あります。
datファイル(カンマ区切りの4~5列、約800行程度)
ProcessData,LOT_ID,3,AP0076686.00C,
ProcessData,LOT_ID_SUB,3,AP0076686.00,
ProcessData,LOT_NO,3,AP0076686,
ProcessData,WAFER_ID,3,AP0076686.19,
ProcessData,WAFER_NO,1,19,
ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00,
ProcessData,PRODGRP_ID,3,T5DH2,
ProcessData,PRODGRP_BIND,3,T5DH2,
ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00,
ProcessData,MAINPD_ID,3,A6L511NY.00,
ProcessData,FLOW_TYPE,3,Main,
ProcessData,FLOW_TYPE_NO,1,1,
ProcessData,D_SEQNO,1,169,
ProcessData,OP_NO,3,PNH PEP.MA1,
ProcessData,OP_NO_NAME,3,本処理,
ProcessData,PD_IDENT,3,PPNHIMA1.00,
ProcessData,PD_IDENT_NAME,3,PEP,
ProcessData,EQP_GROUP_CODE,3,PKRF,
ProcessData,EQP_GROUP_NAME,3,KrF SCANNER(SK3000 + ES5),
ProcessData,EQP_GROUP_BIND,3,PKRF,
ProcessData,EQP_ID,3,PKRF004,
ProcessData,PH_RECIPE_ID,3,PES5MIX,
ProcessData,RCP_NAME_SPACE,3,PEPMA,
ProcessData,LC_RECIPE_ID,3,PKRF.01,
ProcessData,RECIPE_ID,3,PEPMA.PES5MIX,
ProcessData,S_DATE,4,2019/01/24 12:47:09,
ProcessData,E_DATE,4,2019/01/24 12:47:51,
ProcessData,CAST_ID,3,PA0-00349,
ProcessData,SLOT_NO,1,19,

この中から
EQP_IDの時PKRF004
LOT_IDの時AP0076686.00C
Wafer_IDの時AP0076686.19
S_DATEの時2019/01/24 12:47:09
のようにデータを取得し
PKRF004 AP0076686.00C AP0076686.19 2019/01/24 12:47:09
の並びで何100行のようにリスト化されたcsvファイルを作るのが最終的な目標です。
イメージとしては
1.1ファイルの読み込み、解析、必要情報の保持。
2.ファイルの書き出し。
3.ファイルの読み込み、解析、必要情報の保持。
4.ファイルの書き出し。(追記)
というように繰り返し処理を行えばよいと思うのですが  
ロジックの書き方などを理解できていない状態です。

ソースコードの誤りの修正も含めC#に詳しい方、どうかご教授をお願い致します。

発生している問題・エラーメッセージ

エラーメッセージ ハンドルされていない例外 System.ArgumentException:'パスに無効な文字が含まれています。'

該当のソースコード

C#

using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace ConsoleApp1 { class DatRowValues { public string ProcessData { get; set; } public string KeyValue { get; set; } public int IntValue { get; set; } public string StringValue { get; set; } } class NewDatRowValues { public string EqpId { get; set; } public string LotId { get; set; } public string WaferId { get; set; } public DateTime SDate { get; set; } } class NewDatRowValuesMapper : CsvHelper.Configuration.ClassMap<NewDatRowValues> { public NewDatRowValuesMapper() { Map(x => x.EqpId).Index(0); Map(x => x.LotId).Index(1); Map(x => x.WaferId).Index(2); Map(x => x.SDate).Index(3).TypeConverterOption.Format("yyyy/MM/dd HH:mm:ss"); } } class Program { static void Main(string[] args) { // 書き出し用の入れ物を用意 var writeDatList = new List<NewDatRowValues>(); // 読み込み using (var sr = new StreamReader(@"C:\検証用\検証データ\MLOG_RCV*.dat", System.Text.Encoding.GetEncoding("shift_jis"))) using (var inputDat = new CsvHelper.CsvReader(sr)) { inputDat.Configuration.HasHeaderRecord = false; // 必要なキーとなる行のみ抽出 var dat = inputDat.GetRecords<DatRowValues>(); var targetRows = dat.Where(r => r.KeyValue == "EQP_ID" || r.KeyValue == "LOT_ID" || r.KeyValue == "WAFER_ID" || r.KeyValue == "S_DATE"); // それぞれの値を格納 var newRow = new NewDatRowValues(); foreach (var row in targetRows) { if (row.KeyValue == "EQP_ID") { newRow.EqpId = row.StringValue; } if (row.KeyValue == "LOT_ID") { newRow.LotId = row.StringValue; } if (row.KeyValue == "WAFER_ID") { newRow.WaferId = row.StringValue; } if (row.KeyValue == "S_DATE") { newRow.SDate = DateTime.Parse(row.StringValue); } } writeDatList.Add(newRow); } // 書き出し using (var sw = new StreamWriter("list.csv")) using (var outputDat = new CsvHelper.CsvWriter(sw)) { outputDat.Configuration.HasHeaderRecord = false; outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>(); outputDat.WriteRecords(writeDatList); } } } }

試したこと

*が無効な文字ということなので1つのファイル名で直接入力してみましたが
ハンドルされていない例外
CsvHelper.TypeConversion.TypeConverterException: 'The conversion cannot be performed.
Text: '91G208446-19'
MemberType: System.Int32
TypeConverter: 'CsvHelper.TypeConversion.Int32Converter''
というメッセージが表示されました。

補足情報(FW/ツールのバージョンなど)

開発環境Visual Studio2017

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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