いつもお世話になっております。
以前質問した内容に追加するような形になるのですが、数万件あるファイルからある文字列を探すのですが、基本は1つのファイルの中に1種類のEQP_IDがあるのですがEQP_IDが複数のファイルの中に入っている場合があり、EQP_IDが複数ある場合のみテキストファイルに書き出すというようにしたいです。
以前の質問では数万件あるファイルの中からキーとなる文字列を探してテキストファイルに書き出したのでテキストファイルの中身も数万件分と数が一致したのですが、今回はEQP_IDが複数ある場合のみテキストファイルに出力するので約1/4程度になる予定です。
現状のtxtファイル内 EQP_IDが複数あったり1つだけだったりで読み込んだ数万件のファイル全てをリスト化
EQP_ID | LOT_ID | WAFER_ID | S_DATE | RECIPE_ID |
---|---|---|---|---|
PCOT003 | AP0077130.00C | AP0077130.18 | 2019/4/3 23:48 | PEPPR.084 |
WMPN002 | AP0077148.00C | AP0077148.19 | 2019/4/3 21:48 | WET-MN01.084 |
PKRF008 | AP0073456.00C | AP0073456.18 | 2019/4/3 23:30 | CMP-OXID.082 |
OFXS001 | AP0012345.00C | AP0012345.18 | 2019/4/3 20:48 | PEPMA.084 |
PCOT004 | AP0077131.00C | AP0077131.18 | 2019/4/3 23:48 | PEPPR.084 |
PCOT004 | AP0077131.00C | AP0077131.19 | 2019/4/3 23:49 | PEPPR.084 |
AAAA001 | AP0027130.00C | AP0027130.18 | 2019/4/3 18:48 | ABCDE.084 |
BBBB003 | AP0037130.00C | AP0037130.18 | 2019/4/3 19:48 | FGHIJ.084 |
CCCC003 | AP0047130.00C | AP0047130.18 | 2019/4/3 12:48 | KLMNO.084 |
DDDD003 | AP0057130.00C | AP0057130.18 | 2019/4/3 23:40 | EEPPR.084 |
DDDD003 | AP0057130.00C | AP0057130.18 | 2019/4/3 23:41 | EEPPR.084 |
PCOT006 | AP0077154.00C | AP0077154.18 | 2019/4/3 13:20 | AIUEO.084 |
理想のtxtファイル内 EQP_IDが複数あるものだけをリスト化したので1/3~1/4程度のファイル数をリスト化
EQP_ID | LOT_ID | WAFER_ID | S_DATE | RECIPE_ID |
---|---|---|---|---|
PCOT003 | AP0077130.00C | AP0077130.18 | 2019/4/3 23:48 | PEPPR.084 |
PCOT003 | AP0077130.00C | AP0077130.19 | 2019/4/3 23:49 | PEPPR.084 |
PCOT003 | AP0077130.00C | AP0077130.20 | 2019/4/3 23:50 | PEPPR.084 |
PCOT004 | AP0077131.00C | AP0077131.18 | 2019/4/3 23:48 | PEPPR.084 |
PCOT004 | AP0077131.00C | AP0077131.19 | 2019/4/3 23:49 | PEPPR.084 |
WMPN002 | AP0077148.00C | AP0077148.19 | 2019/4/3 21:48 | WET-MN01.084 |
WMPN002 | AP0077148.00C | AP0077148.20 | 2019/4/3 21:49 | WET-MN01.084 |
PKRF008 | AP0073456.00C | AP0073456.18 | 2019/4/3 23:30 | CMP-OXID.082 |
PKRF008 | AP0073456.00C | AP0073456.19 | 2019/4/3 23:31 | CMP-OXID.082 |
DDDD003 | AP0057130.00C | AP0057130.18 | 2019/4/3 23:40 | EEPPR.084 |
DDDD003 | AP0057130.00C | AP0057130.18 | 2019/4/3 23:41 | EEPPR.084 |
のように複数個の頭4文字が同じ(例:PCOT)EQP_IDがあるものだけをテキストファイルに出力して1個しかないEQP_IDについては出力しないようにしたいと考えています。
using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace ConsoleApp6 { class DatRowValues { public string ProcessData { get; set; } public string KeyValue { get; set; } public string IntValue { get; set; } public string StringValue { get; set; } public string Value { get; set; } } class NewDatRowValues { public string EqpId { get; set; } public string LotId { get; set; } public string WaferId { get; set; } public DateTime SDate { get; set; } public string RecipeId { 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"); Map(x => x.RecipeId).Index(4); } } class Program { static void Main(string[] args) { // 書き出し用の入れ物を用意 var writeDatList = new List<NewDatRowValues>(); // 読み込み foreach (string fileName in Directory.GetFiles(@"C:\20190404", "*.dat")) using (var sr = new StreamReader(fileName, 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" || r.KeyValue == "RECIPE_ID"); // それぞれの値を格納 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); } if (row.KeyValue == "RECIPE_ID") { newRow.RecipeId = row.StringValue; } } writeDatList.Add(newRow); } // 書き出し using (var sw = new StreamWriter(@"C:\テスト\list.csv")) using (var outputDat = new CsvHelper.CsvWriter(sw)) { outputDat.Configuration.HasHeaderRecord = false; outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>(); outputDat.WriteRecords(writeDatList); } } } }
現状の私の知識と経験では実現出来ない仕様です。。。。
どうかご教授を宜しくお願い致します。
説明で分かりにくい部分や不足している部分がある場合はご指摘をお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/12 00:47
2019/04/12 02:15
2019/04/12 02:38