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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

1864閲覧

数万件あるファイルの中身を読み込みある特定の文字列が同じものだけをテキストファイルに書き出す

ShinyaKojima

総合スコア18

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/04/11 09:15

いつもお世話になっております。

以前質問した内容に追加するような形になるのですが、数万件あるファイルからある文字列を探すのですが、基本は1つのファイルの中に1種類のEQP_IDがあるのですがEQP_IDが複数のファイルの中に入っている場合があり、EQP_IDが複数ある場合のみテキストファイルに書き出すというようにしたいです。
以前の質問では数万件あるファイルの中からキーとなる文字列を探してテキストファイルに書き出したのでテキストファイルの中身も数万件分と数が一致したのですが、今回はEQP_IDが複数ある場合のみテキストファイルに出力するので約1/4程度になる予定です。

現状のtxtファイル内 EQP_IDが複数あったり1つだけだったりで読み込んだ数万件のファイル全てをリスト化

EQP_IDLOT_IDWAFER_IDS_DATERECIPE_ID
PCOT003AP0077130.00CAP0077130.182019/4/3 23:48PEPPR.084
WMPN002AP0077148.00CAP0077148.192019/4/3 21:48WET-MN01.084
PKRF008AP0073456.00CAP0073456.182019/4/3 23:30CMP-OXID.082
OFXS001AP0012345.00CAP0012345.182019/4/3 20:48PEPMA.084
PCOT004AP0077131.00CAP0077131.182019/4/3 23:48PEPPR.084
PCOT004AP0077131.00CAP0077131.192019/4/3 23:49PEPPR.084
AAAA001AP0027130.00CAP0027130.182019/4/3 18:48ABCDE.084
BBBB003AP0037130.00CAP0037130.182019/4/3 19:48FGHIJ.084
CCCC003AP0047130.00CAP0047130.182019/4/3 12:48KLMNO.084
DDDD003AP0057130.00CAP0057130.182019/4/3 23:40EEPPR.084
DDDD003AP0057130.00CAP0057130.182019/4/3 23:41EEPPR.084
PCOT006AP0077154.00CAP0077154.182019/4/3 13:20AIUEO.084

理想のtxtファイル内 EQP_IDが複数あるものだけをリスト化したので1/3~1/4程度のファイル数をリスト化

EQP_IDLOT_IDWAFER_IDS_DATERECIPE_ID
PCOT003AP0077130.00CAP0077130.182019/4/3 23:48PEPPR.084
PCOT003AP0077130.00CAP0077130.192019/4/3 23:49PEPPR.084
PCOT003AP0077130.00CAP0077130.202019/4/3 23:50PEPPR.084
PCOT004AP0077131.00CAP0077131.182019/4/3 23:48PEPPR.084
PCOT004AP0077131.00CAP0077131.192019/4/3 23:49PEPPR.084
WMPN002AP0077148.00CAP0077148.192019/4/3 21:48WET-MN01.084
WMPN002AP0077148.00CAP0077148.202019/4/3 21:49WET-MN01.084
PKRF008AP0073456.00CAP0073456.182019/4/3 23:30CMP-OXID.082
PKRF008AP0073456.00CAP0073456.192019/4/3 23:31CMP-OXID.082
DDDD003AP0057130.00CAP0057130.182019/4/3 23:40EEPPR.084
DDDD003AP0057130.00CAP0057130.182019/4/3 23:41EEPPR.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); } } } }

現状の私の知識と経験では実現出来ない仕様です。。。。

どうかご教授を宜しくお願い致します。

説明で分かりにくい部分や不足している部分がある場合はご指摘をお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

LINQを使うと簡単です。
writeDatList が満たされているとすると

C#

1var writingList = writeDatList.GroupBy(r => r.EqpId) 2 .Where(g => g.Count() > 1) 3 .SelectMany(g => g) 4 .ToList();

かな?

投稿2019/04/11 10:16

hihijiji

総合スコア4150

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

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

ShinyaKojima

2019/04/12 00:47

LINQの使い方についてもう少し詳しく解説をお願いできますでしょうか? サイトを見てもあまり理解できてなくて・・・ var writingList = writeDatList.GroupBy(r => r.EqpId) //EqpIdから必要なキーを抽出 .Where(g => g.Count() > 1) //EQP_IDが1より多いものを探す .SelectMany(g => g) //EQP_IDが複数個のもののみ選択 .ToList(); //リストに書き込む みたいな解釈でよろしいでしょうか? SelectManyの部分がSQLっぽい感覚だったのですね これを使うとしたら 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); } } } の一番最後の書き出しの部分を変更だと思うのですが 間違えていたらすみません。
hihijiji

2019/04/12 02:15

GroupByメソッド,SelectManyメソッドの解釈があやふやなところ以外はあってます。 GroupByメソッド,SelectManyメソッドについて詳しくはそれぞれ "LINQ GroupBy","LINQ SelectMany"でweb検索をして調べてください。
guest

0

回答ではありません。

確か、以前の質問というのが

DATファイル

1ProcessData,LOT_ID,3,AP0076686.00C, 2ProcessData,LOT_ID_SUB,3,AP0076686.00, 3ProcessData,LOT_NO,3,AP0076686, 4ProcessData,WAFER_ID,3,AP0076686.19, 5ProcessData,WAFER_NO,1,19, 6ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00, 7ProcessData,PRODGRP_ID,3,T5DH2, 8ProcessData,PRODGRP_BIND,3,T5DH2, 9ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00, 10ProcessData,MAINPD_ID,3,A6L511NY.00, 11ProcessData,FLOW_TYPE,3,Main, 12ProcessData,FLOW_TYPE_NO,1,1, 13ProcessData,D_SEQNO,1,169, 14ProcessData,OP_NO,3,PNH PEP.MA1, 15ProcessData,OP_NO_NAME,3,本処理, 16ProcessData,PD_IDENT,3,PPNHIMA1.00, 17ProcessData,PD_IDENT_NAME,3,PEP, 18ProcessData,EQP_GROUP_CODE,3,PKRF, 19ProcessData,EQP_GROUP_NAME,3,KrF SCANNER(SK3000 + ES5), 20ProcessData,EQP_GROUP_BIND,3,PKRF, 21ProcessData,EQP_ID,3,PKRF004, 22ProcessData,PH_RECIPE_ID,3,PES5MIX, 23ProcessData,RCP_NAME_SPACE,3,PEPMA, 24ProcessData,LC_RECIPE_ID,3,PKRF.01, 25ProcessData,RECIPE_ID,3,PEPMA.PES5MIX, 26ProcessData,S_DATE,4,2019/01/24 12:47:09, 27ProcessData,E_DATE,4,2019/01/24 12:47:51, 28ProcessData,CAST_ID,3,PA0-00349, 29ProcessData,SLOT_NO,1,19,

という中身のファイルから該当データ取り出して
EQP_ID LOT_ID WAFER_ID S_DATE RECIPE_ID
という1行のデータにして別のCSVへ出力するというものだったと思います。
これは、1ファイル1組という制約のもとにプログラムされていたかと思います。

今回は、この元のファイル1つにEQP_IDなどの組み合わせが複数存在するファイルがあり、
そのファイルに出てきたEQP_IDなどの組み合わせのみ別ファイルに出力するということでしょうか?
例)

DATファイル1

1ProcessData,LOT_ID,3,AP0076686.00C, 2ProcessData,LOT_NO,3,AP0076686, 3ProcessData,WAFER_ID,3,AP0076686.19, 4ProcessData,WAFER_NO,1,19, 5ProcessData,EQP_ID,3,PKRF004, 6ProcessData,LC_RECIPE_ID,3,PKRF.01, 7ProcessData,RECIPE_ID,3,PEPMA.PES5MIX, 8ProcessData,S_DATE,4,2019/01/24 12:47:09, 9ProcessData,SLOT_NO,1,19,

というファイルのEQP_IDなどの組み合わせが1つのデータは出力せず

DATファイル2

1ProcessData,LOT_ID,3,AP0076686.00C, 2ProcessData,LOT_NO,3,AP0076686, 3ProcessData,WAFER_ID,3,AP0076686.19, 4ProcessData,WAFER_NO,1,19, 5ProcessData,EQP_ID,3,PKRF004, 6ProcessData,LC_RECIPE_ID,3,PKRF.01, 7ProcessData,RECIPE_ID,3,PEPMA.PES5MIX, 8ProcessData,S_DATE,4,2019/01/24 12:47:09, 9ProcessData,SLOT_NO,1,19, 10ProcessData,LOT_ID,3,AP0011111.00B, 11ProcessData,LOT_NO,3,AP0011111, 12ProcessData,WAFER_ID,3,AP0011111.19, 13ProcessData,WAFER_NO,1,19, 14ProcessData,EQP_ID,3,PKRF003, 15ProcessData,LC_RECIPE_ID,3,PKRF.01, 16ProcessData,RECIPE_ID,3,PEPMA.PES5MIX, 17ProcessData,S_DATE,4,2019/01/24 12:47:09, 18ProcessData,SLOT_NO,1,19,

みたいに2組以上存在するファイルのデータを出力ということでしょうか?

投稿2019/04/11 11:51

YAmaGNZ

総合スコア10242

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

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

ShinyaKojima

2019/04/12 00:21

説明が分かりにくいと思いますが例えば 1.datの中身だと,EQP_IDがPKRF008, ProcessData,LOT_ID,3,AE0008245.00C, ProcessData,LOT_ID_SUB,3,AE0008245.00, ProcessData,LOT_NO,3,AE0008245, ProcessData,WAFER_ID,3,AE0008245.04, ProcessData,WAFER_NO,1,04, ProcessData,PRODSPEC_ID,3,T6VL81001-00001.00, ProcessData,PRODGRP_ID,3,T6VL8, ProcessData,PRODGRP_BIND,3,T6VL8, ProcessData,MAIN_MAINPD_ID,3,A4H611NA.00, ProcessData,MAINPD_ID,3,A4H611NA.00, ProcessData,FLOW_TYPE,3,Main, ProcessData,FLOW_TYPE_NO,1,1, ProcessData,D_SEQNO,1,322, ProcessData,OP_NO,3,D2I PEP.MA1, ProcessData,OP_NO_NAME,3,本処理, ProcessData,PD_IDENT,3,PD2IIMA1.01, ProcessData,PD_IDENT_NAME,3,PEP, ProcessData,EQP_GROUP_CODE,3,PKRH, ProcessData,EQP_GROUP_NAME,3,ES6+Lithius, ProcessData,EQP_GROUP_BIND,3,PKRH, ProcessData,EQP_ID,3,PKRF008, ProcessData,PH_RECIPE_ID,3,PES6HIAMIX, ProcessData,RCP_NAME_SPACE,3,PEPMA, ProcessData,LC_RECIPE_ID,3,PKRF.01, ProcessData,RECIPE_ID,3,PEPMA.PES6HIAMIX, ProcessData,S_DATE,4,2019/04/02 23:58:27, ProcessData,E_DATE,4,2019/04/02 23:58:27, 2.datの中身は,EQP_IDがPKRF008, ProcessData,LOT_ID,3,AE0008245.00C, ProcessData,LOT_ID_SUB,3,AE0008245.00, ProcessData,LOT_NO,3,AE0008245, ProcessData,WAFER_ID,3,AE0008245.04, ProcessData,WAFER_NO,1,04, ProcessData,PRODSPEC_ID,3,T6VL81001-00001.00, ProcessData,PRODGRP_ID,3,T6VL8, ProcessData,PRODGRP_BIND,3,T6VL8, ProcessData,MAIN_MAINPD_ID,3,A4H611NA.00, ProcessData,MAINPD_ID,3,A4H611NA.00, ProcessData,FLOW_TYPE,3,Main, ProcessData,FLOW_TYPE_NO,1,1, ProcessData,D_SEQNO,1,322, ProcessData,OP_NO,3,D2I PEP.MA1, ProcessData,OP_NO_NAME,3,本処理, ProcessData,PD_IDENT,3,PD2IIMA1.01, ProcessData,PD_IDENT_NAME,3,PEP, ProcessData,EQP_GROUP_CODE,3,PKRH, ProcessData,EQP_GROUP_NAME,3,ES6+Lithius, ProcessData,EQP_GROUP_BIND,3,PKRH, ProcessData,EQP_ID,3,PKRF008, ProcessData,PH_RECIPE_ID,3,PES6HIAMIX, ProcessData,RCP_NAME_SPACE,3,PEPMA, ProcessData,LC_RECIPE_ID,3,PKRF.01, ProcessData,RECIPE_ID,3,PEPMA.PES6HIAMIX, ProcessData,S_DATE,4,2019/04/02 23:58:27, ProcessData,E_DATE,4,2019/04/02 23:58:27, ProcessData,CAST_ID,3,PA0-01556, ProcessData,SLOT_NO,1,4, ProcessData,DEPT_CODE,3,DEPT, 3.datの中身はEQP_IDがISHX004 ProcessData,LOT_ID,3,SP0009059.00C, ProcessData,LOT_ID_SUB,3,SP0009059.00, ProcessData,LOT_NO,3,SP0009059, ProcessData,WAFER_ID,3,SP0009059.20, ProcessData,WAFER_NO,1,20, ProcessData,PRODSPEC_ID,3,TLAACZ041-01000.00, ProcessData,PRODGRP_ID,3,F550, ProcessData,PRODGRP_BIND,3,F550, ProcessData,MAIN_MAINPD_ID,3,A6L501OA.00, ProcessData,MAINPD_ID,3,A6L501OA.00, ProcessData,FLOW_TYPE,3,Main, ProcessData,FLOW_TYPE_NO,1,1, ProcessData,D_SEQNO,1,346, ProcessData,OP_NO,3,MR II2.MA1, ProcessData,OP_NO_NAME,3,本処理, ProcessData,PD_IDENT,3,I298IMA1.00, ProcessData,PD_IDENT_NAME,3,IMPLA, ProcessData,EQP_GROUP_CODE,3,ISH3, ProcessData,EQP_GROUP_NAME,3,SHX III, ProcessData,EQP_GROUP_BIND,3,ISH3, ProcessData,EQP_ID,3,ISHX004, ProcessData,PH_RECIPE_ID,3,LS1B5-5K4923A4NS, ProcessData,RCP_NAME_SPACE,3,IMP-HC02, ProcessData,LC_RECIPE_ID,3,LS1B5-5K4923A4NS.00, ProcessData,RECIPE_ID,3,IMP-HC02.LS1B5-5K4923A4NS, ProcessData,S_DATE,4,2019/04/02 23:58:29, ProcessData,E_DATE,4,2019/04/02 23:58:29, ProcessData,CAST_ID,3,PA0-01019, ProcessData,SLOT_NO,1,20, ProcessData,DEPT_CODE,3,DEPT, 4.datの中身がEQP_IDがWMPD107 ProcessData,LOT_ID,3,SP0008623.00C, ProcessData,LOT_ID_SUB,3,SP0008623.00, ProcessData,LOT_NO,3,SP0008623, ProcessData,WAFER_ID,3,SP0008623.07, ProcessData,WAFER_NO,1,07, ProcessData,PRODSPEC_ID,3,TCAADA726-01000.00, ProcessData,PRODGRP_ID,3,E586, ProcessData,PRODGRP_BIND,3,E586, ProcessData,MAIN_MAINPD_ID,3,A5S400NM.00, ProcessData,MAINPD_ID,3,A5S400NM.00, ProcessData,FLOW_TYPE,3,Main, ProcessData,FLOW_TYPE_NO,1,1, ProcessData,D_SEQNO,1,467, ProcessData,OP_NO,3,V2 DET Rimen.MA1, ProcessData,OP_NO_NAME,3,本処理, ProcessData,PD_IDENT,3,W218IMA1.00, ProcessData,PD_IDENT_NAME,3,WET, ProcessData,EQP_GROUP_CODE,3,WMPD, ProcessData,EQP_GROUP_NAME,3,MP-3000(D-DI), ProcessData,EQP_GROUP_BIND,3,WMPD, ProcessData,EQP_ID,3,WMPD107, ProcessData,PH_RECIPE_ID,3,551, ProcessData,RCP_NAME_SPACE,3,WET-MD01, ProcessData,LC_RECIPE_ID,3,S-FN2-BSC2+DHF.00, ProcessData,RECIPE_ID,3,WET-MD01.551, ProcessData,S_DATE,4,2019/04/02 23:54:55, ProcessData,E_DATE,4,2019/04/02 23:58:57, ProcessData,CAST_ID,3,0300-4397, ProcessData,SLOT_NO,1,7, 5.datの中身は,EQP_IDがPKRF007 ProcessData,LOT_ID,3,SP0008653.00C, ProcessData,LOT_ID_SUB,3,SP0008653.00, ProcessData,LOT_NO,3,SP0008653, ProcessData,WAFER_ID,3,SP0008653.08, ProcessData,WAFER_NO,1,08, ProcessData,PRODSPEC_ID,3,TCAADA726-01000.00, ProcessData,PRODGRP_ID,3,E586, ProcessData,PRODGRP_BIND,3,E586, ProcessData,MAIN_MAINPD_ID,3,A5S400NM.00, ProcessData,MAINPD_ID,3,A5S400NM.00, ProcessData,FLOW_TYPE,3,Main, ProcessData,FLOW_TYPE_NO,1,1, ProcessData,D_SEQNO,1,473, ProcessData,OP_NO,3,D2 LTO Ri Br.MA1, ProcessData,OP_NO_NAME,3,本処理, ProcessData,PD_IDENT,3,B203IMA1.00, ProcessData,PD_IDENT_NAME,3,Brush, ProcessData,EQP_GROUP_CODE,3,PKRF, ProcessData,EQP_GROUP_NAME,3,SC300, ProcessData,EQP_GROUP_BIND,3,PKRF, ProcessData,EQP_ID,3,PKRF007, ProcessData,PH_RECIPE_ID,3,557, ProcessData,RCP_NAME_SPACE,3,WET-SC01, ProcessData,LC_RECIPE_ID,3,S-BRUSH-SPRAY70L-A.00, ProcessData,RECIPE_ID,3,WET-SC01.557, ということなのでこの場合はEQP_IDの頭4桁が2個以上存在するPKRFのみなので PKRF〇〇〇のdatファイルのみをテキストファイルまたはCSVファイルにリスト化したいということです datファイルが数万件ありPKRF〇〇〇のEQP_IDが複数個WMPD〇〇〇のEQP_IDが複数個、CPRD〇〇〇のEQP_IDは1つだけなどEQP_IDの数は定まっていませんがこれが実現出来たら数万件のリストが数千件程度になるということです。 1つのdatファイルには1つしかEQP_IDが存在しませんが、同じEQP_IDが含まれているdatファイルは複数個ある可能性があるという解釈でお願いします。
YAmaGNZ

2019/04/12 01:08

そうであれば、全部のファイルを処理した後のwriteDataListを処理するhihijijiさんの回答がいいと思います。
ShinyaKojima

2019/04/12 01:39

全部のファイルを処理した後の書き出しの部分だと思うのですが var writingList = writeDatList.GroupBy(r => r.EqpId) .Where(g => g.Count() > 1) .SelectMany(g => g) .ToList(); の.ToList();を.ToList(@"C:\テスト\list.csv"); というふうにしたら「引数1を指定するメソッドToListのオーバーロードはありません」というエラーが出てしまいます。 // 書き出し 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); var writingList = writeDatList.GroupBy(r => r.EqpId) .Where(g => g.Count() > 1) .SelectMany(g => g) .ToList(); } だとエラーはありませんが追加する前と後のファイルの数が変わりません・・・ 申し訳ないですが解説をお願い致します。
YAmaGNZ

2019/04/12 02:09

上記ソースですと outputDat.WriteRecords(writeDatList); の書き込みの後に var writingList = writeDatList.GroupBy(r => r.EqpId)~ とリストの再構築をおこなっています。 var writingList = writeDatList.GroupBy(r => r.EqpId)~ とリストの再構築を行ってから // 書き出し にてwriteDatListではなくwritingList の書き出しを行うようにしてください。 また、提示されたGroupbyだとEqpIdが完全一致するものをグループ化しますので、r.EqpId.SubString(0,4)など、左から4文字限定としてください。
ShinyaKojima

2019/04/12 02:41

なるほど!! 意味が分かりました。あと上記のソースだとWriteRecords(writeDatList);をWriteRecords(writingList); に変えても宣言前には使用できないから // 書き出し using (var sw = new StreamWriter(@"C:\テスト\list.csv")) using (var outputDat = new CsvHelper.CsvWriter(sw)) { var writingList = writeDatList.GroupBy(r => r.EqpId.Substring(0, 4)) .Where(g => g.Count() > 1) .SelectMany(g => g) .ToList(); outputDat.Configuration.HasHeaderRecord = false; outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>(); outputDat.WriteRecords(writingList); } ということですね。 理想通りの結果を出すことができました。 いつもありがとうございます。 また宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問