private static void Run(Options options) { options.Print(Console.Out); Csv shareInfo = Csv.Load(options.ShareFile, Encoding.GetEncoding("gb2312"), "\t", StringSplitOptions.RemoveEmptyEntries); Csv priceInfo = Csv.Load(options.PriceFile, Encoding.GetEncoding("gb2312"), "\t", StringSplitOptions.RemoveEmptyEntries); int codeColumnIndexInShareInfo = Array.IndexOf(shareInfo.Header, "代码"); int codeColumnIndexInPriceInfo = Array.IndexOf(priceInfo.Header, "代码"); int totalShareNumberColumnIndex = Array.IndexOf(shareInfo.Header, "总股数"); int marketPriceColumnIndex = Array.IndexOf(priceInfo.Header, "昨收"); int nameColumnIndex = Array.IndexOf(priceInfo.Header, "名称"); Dictionary <string, decimal> shares = new Dictionary <string, decimal>(); for (int i = 0; i < shareInfo.RowCount; ++i) { string code = GetPureCode(shareInfo[i][codeColumnIndexInShareInfo]); decimal totalShareNumber = decimal.Parse(shareInfo[i][totalShareNumberColumnIndex]); shares.Add(code, totalShareNumber); } Dictionary <string, Tuple <string, decimal> > prices = new Dictionary <string, Tuple <string, decimal> >(); for (int i = 0; i < priceInfo.RowCount; ++i) { string code = GetPureCode(priceInfo[i][codeColumnIndexInShareInfo]); decimal marketPrice = decimal.Parse(priceInfo[i][marketPriceColumnIndex]); string name = priceInfo[i][nameColumnIndex]; prices.Add(code, Tuple.Create(name, marketPrice)); } // join the keys var codes = shares.Keys.Union(prices.Keys).OrderBy(s => s); string[] header = new string[] { "CODE", "NAME", "TotalShare", "MarketPrice" }; Csv marketValues = new Csv(header); foreach (var code in codes) { string[] row = new string[] { NormalizeCode(code), prices.ContainsKey(code) ? prices[code].Item1 : "Unknown", shares.ContainsKey(code) ? shares[code].ToString() : "0.0", prices.ContainsKey(code) ? prices[code].Item2.ToString() : "0.0" }; marketValues.AddRow(row); } Csv.Save(marketValues, options.OutputFile, Encoding.UTF8, ","); Console.WriteLine("Done."); }
// Implemented from ITest public bool Export(Stream stream) { var targetPoints = parameters.targetPoints; targetPoints.Sort(); targetPoints.Reverse(); var resultsTable = testResults.resultsTable; var csv = new Csv(); csv.AddRow(new Csv.Row().AddCol(DOCUMENT_HEADER)); csv.AddRow(new Csv.Row().AddCol("Test Time:").AddCol(testResults.testDuration.ToString())); var header = new Csv.Row(); csv.AddRow(header); header.AddCol("Part Number") .AddCol("Serial Number") .AddCol("Test Date") .AddCol("Instrument Model") .AddCol("Instrument Serial Number") .AddCol("Accuracy") .AddCol("Calibration Date") .AddCol("Certified By") .AddCol("Temperature ºC") .AddCol("%RH") .AddCol("Error Band"); foreach (var tp in targetPoints) { header.AddCol("Calibration Standard") .AddCol("Appion Device") .AddCol("Units") .AddCol("Min (-" + testResults.errorBand.ToString("P1") + ")") .AddCol("Max (+" + testResults.errorBand.ToString("P1") + ")"); } header.AddCol("Failures") .AddCol("Error(avg)") .AddCol("Error(max)"); foreach (var sn in resultsTable.Keys) { var results = resultsTable[sn]; var row = new Csv.Row(); csv.AddRow(row); row.AddCol(sn.deviceModel.GetUnlocalizedPartNumber()) .AddCol(sn.ToString()) .AddCol(DateTime.Now.ToShortDateString()) .AddCol(testResults.instrumentModel) .AddCol(testResults.instrumentSerialNumber) .AddCol(testResults.instrumentAccuracy.ToString("P1")) .AddCol(testResults.instrumentCalibrationDate.ToShortDateString()) .AddCol(testResults.certifiedBy) .AddCol(testResults.temperature.amount.ToString("N1")) .AddCol(testResults.humidity.amount.ToString("N1")) .AddCol(testResults.errorBand.ToString("P1")); double avg = 0, max = 0; int failures = 0; foreach (var tp in targetPoints) { var eb = testResults.errorBand; var result = results[tp]; if (result == null) { row.AddCol("N/A") .AddCol("N/A") .AddCol("N/A") .AddCol("N/A") .AddCol("N/A"); } else { var rmeas = result.result; row.AddCol(tp.measurement.amount.ToString("#")) .AddCol(rmeas.amount.ToString("#")) .AddCol(tp.measurement.unit.ToString()) .AddCol((tp.measurement.amount - (tp.measurement.amount * eb)).ToString("#")) .AddCol((tp.measurement.amount + (tp.measurement.amount * eb)).ToString("#")); TestParameters.Grade grade; if (parameters.FindGradeForMeasurement(tp, rmeas, out grade)) { if (!grade.passable) { failures++; } } avg += result.error; if (result.error > max) { max = result.error; } } } row.AddCol(failures.ToString()) .AddCol((avg / targetPoints.Count).ToString("P1")) .AddCol(max.ToString("P1")); } var ret = csv.Export(stream); return(ret); }
static void MergeFile(string fullDataFile, string deltaDataFile) { if (!File.Exists(fullDataFile) || !File.Exists(deltaDataFile)) { Console.WriteLine("file {0} or {1} does not exist", fullDataFile, deltaDataFile); return; } var fullData = Csv.Load(fullDataFile, Encoding.UTF8, ","); var deltaData = Csv.Load(deltaDataFile, Encoding.UTF8, ","); var mergedData = new Csv(fullData.Header); var orderedFullData = fullData.Rows .Select(columns => Tuple.Create(DateTime.Parse(columns[1]), columns)) .GroupBy(tuple => tuple.Item1) .Select(g => g.First()) .OrderBy(tuple => tuple.Item1) .ToArray(); var orderedDeltaData = deltaData.Rows .Select(columns => Tuple.Create(DateTime.Parse(columns[1]), columns)) .GroupBy(tuple => tuple.Item1) .Select(g => g.First()) .OrderBy(tuple => tuple.Item1) .ToArray(); var i = 0; var j = 0; while (i < orderedFullData.Length || j < orderedDeltaData.Length) { if (j >= orderedDeltaData.Length) { mergedData.AddRow(orderedFullData[i].Item2); ++i; } else if (i >= orderedFullData.Length) { mergedData.AddRow(orderedDeltaData[j].Item2); ++j; } else { var date1 = orderedFullData[i].Item1; var date2 = orderedDeltaData[j].Item1; if (date1 < date2) { mergedData.AddRow(orderedFullData[i].Item2); ++i; } else if (date1 > date2) { mergedData.AddRow(orderedDeltaData[j].Item2); ++j; } else { mergedData.AddRow(orderedDeltaData[j].Item2); ++i; ++j; } } } // save merged file to full data file Csv.Save(mergedData, fullDataFile, Encoding.UTF8, ","); // remove delta file after merging File.Delete(deltaDataFile); }
static void MergeFile(string fullDataFile, string deltaDataFile) { if (!File.Exists(fullDataFile) || !File.Exists(deltaDataFile)) { Console.WriteLine("file {0} or {1} does not exist", fullDataFile, deltaDataFile); return; } Csv fullData = Csv.Load(fullDataFile, Encoding.UTF8, ","); Csv deltaData = Csv.Load(deltaDataFile, Encoding.UTF8, ","); Csv mergedData = new Csv(fullData.Header); var orderedFullData = fullData.Rows.OrderBy(columns => DateTime.Parse(columns[1])).ToArray(); var orderedDeltaData = deltaData.Rows.OrderBy(columns => DateTime.Parse(columns[1])).ToArray(); int i = 0; int j = 0; while (i < orderedFullData.Length || j < orderedDeltaData.Length) { if (j >= orderedDeltaData.Length) { mergedData.AddRow(orderedFullData[i]); ++i; } else if (i >= orderedFullData.Length) { mergedData.AddRow(orderedDeltaData[j]); ++j; } else { DateTime date1 = DateTime.Parse(orderedFullData[i][1]); DateTime date2 = DateTime.Parse(orderedDeltaData[j][1]); if (date1 < date2) { mergedData.AddRow(orderedFullData[i]); ++i; } else if (date1 > date2) { mergedData.AddRow(orderedDeltaData[j]); ++j; } else { mergedData.AddRow(orderedDeltaData[j]); ++i; ++j; } } } // save merged file to full data file Csv.Save(mergedData, fullDataFile, Encoding.UTF8, ","); // remove delta file after merging File.Delete(deltaDataFile); }