public static CSVData Filter(CSVData data, Func <RowType, bool> predicate) { CSVData ret = new CSVData(data); ret.FilterInPlace(predicate); return(ret); }
public static CSVData Filter(CSVData data, Func <Dictionary <string, string>, bool> predicate) { CSVData ret = new CSVData(data); ret.FilterInPlace(predicate); return(ret); }
public void GroupBy(List <string> keys, Dictionary <string, Func <List <string>, string> > mergeKeysAndFuncs) { if (keys.Any(mergeKeysAndFuncs.Keys.Contains)) { string message = String.Format("GroupBy: keys({0}) can not overlap with the mergeKeys({1})", String.Join(",", keys), String.Join(",", mergeKeysAndFuncs.Keys)); throw new ArgumentOutOfRangeException(nameof(keys), message); } List <int> keyIdxs = keys.Select(key => ColIdxMap[key]).ToList(); string dummyColName = String.Format("##{0}", String.Join("##", keys)); AddColumn(dummyColName, row => { var subrow = new List <string>(); keyIdxs.ForEach(idx => subrow.Add(row[idx])); return(String.Join("##", subrow)); }); List <string> entries = GetColumnRaw(dummyColName).Distinct().ToList(); Dictionary <string, CSVData> entriesToData = new Dictionary <string, CSVData>(); int dummyEntryIdx = ColIdxMap[dummyColName]; entries.ForEach(entry => { CSVData data = new CSVData(_columns, _rows); data.FilterInPlace(row => row[dummyEntryIdx] == entry); entriesToData[entry] = data; }); List <List <string> > newRows = entriesToData.ToList().Select(kvp1 => { Dictionary <string, string> newColValues = mergeKeysAndFuncs.ToDictionary( kvp2 => kvp2.Key, kvp2 => kvp2.Value(kvp1.Value.GetColumnRaw(kvp2.Key)) ); List <string> ret = new List <string>(); keyIdxs.ForEach(idx => ret.Add(kvp1.Value._rows[0][idx])); newColValues.ToList().ForEach(kvp => ret.Add(kvp.Value)); return(ret); }).ToList(); List <string> newCols = keys; newCols.AddRange(mergeKeysAndFuncs.ToList().Select(kvp => kvp.Key)); SetColumnsAndRows(newCols, newRows); }