public IdToCodeWorker(ExportWorker <TModel> export) { LoginCompanyId = export.LoginCompanyId; LoginCompanyCode = export.LoginCompanyCode; LoginUserId = export.LoginUserId; LoginUserCode = export.LoginUserCode; Records = export.Records; RecordCount = export.RecordCount; IdResolutionQueue = export.IdResolutionQueue; }
public async Task <int> ExportAsync(string csvPath, List <TModel> original, CancellationToken cancel, IProgress <int> progress, Action <StringBuilder> specialHeaderHandler = null) { if (cancel.IsCancellationRequested) { return(0); } progress.Report(20); // 進捗:取込対象データ読込完了 var export = new ExportWorker <TModel>(RowDef.DataExpression); export.LoginUserId = UserId; export.LoginUserCode = UserCode; export.LoginCompanyId = CompanyId; export.LoginCompanyCode = CompanyCode; RowDef.SetupFields(); var sb = new StringBuilder(); specialHeaderHandler?.Invoke(sb); // header var header = RowDef.GetHeaderAry(); if (header != null) { sb.AppendLine(string.Join(RowDef.Delimiter, header)); } await Task.Run(() => { foreach (TModel m in original) { export.NewRecord(m); RowDef.Do(export); } }, cancel); // DB関連チェック var validate = new IdToCodeWorker <TModel>(export); // Exportの結果を引き渡す RowDef.Do(validate); // DBチェック&エラー情報収集 // TODO: 文字列項目は強制でダブルクォート という要件 await Task.Run(() => { foreach (var record in validate.Records.Values) { for (int i = 0; i < record.Count; i++) { if (record[i] == null) { continue; } if (record[i].IndexOf("\"") >= 0 || record[i].IndexOf(RowDef.Delimiter) >= 0 || record[i].IndexOf("\r") >= 0 || record[i].IndexOf("\n") >= 0) { record[i] = "\"" + record[i].Replace("\"", "\"\"") + "\""; } } sb.AppendLine(string.Join(RowDef.Delimiter, record.ToArray())); } }); try { File.WriteAllText(csvPath, sb.ToString(), CsvEncoding); } catch (Exception e) { Exception = e; return(0); } return(validate.Records.Count); }