前提・実現したいこと
初めて質問致します。至らない点があれば申し訳ございません。
最近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

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/04 00:02
2019/04/04 00:32
2019/04/04 00:43 編集
2019/04/04 00:47
2019/04/04 00:52
2019/04/04 00:54
2019/04/04 01:11
2019/04/04 01:20
2019/04/08 09:34