お世話になっております。
Visual Studio2017でC#の開発をしています。
内容としては比較的単純な動作(datファイルの中から必要なキーとなる行のみを抽出しそれぞれの値を格納、csvファイルとして書き出す作業をフォルダ内のdatファイルの数だけ作業を繰り返すようにしています。
実行時に検証としてデータを約1万6千件程度で試したところ、正しく動作しcsvファイルも想定していた内容で作成されました。
しかし、4万件を超えたあたりから
「リソース制限を超過しています。このウィンドウのデータコレクションが停止しました。」
という表示が出て処理が途中で止まりcsvファイルが作成されませんでした。
1つのフォルダに約18万件のdatファイル(1つ約40kb程度)が入っているものをまとめて処理して1つのcsvにしたいと考えていますが、解決策が見つかりません。
詳しい方、どうかご教授をお願い致します。
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 string 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>(); // 読み込み foreach (string fileName in Directory.GetFiles(@"C:\検証用\検証データ\MLOG_RCV\BACKUP", "*.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"); // それぞれの値を格納 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(@"C:\検証用\検証データ\MLOG_RCV\BACKUP\list.csv")) using (var outputDat = new CsvHelper.CsvWriter(sw)) { outputDat.Configuration.HasHeaderRecord = false; outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>(); outputDat.WriteRecords(writeDatList); } } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/05 01:28
2019/04/05 02:15