コード例 #1
0
ファイル: CSVData.cs プロジェクト: akankshvashisth/CSVData
        public static CSVData Filter(CSVData data, Func <RowType, bool> predicate)
        {
            CSVData ret = new CSVData(data);

            ret.FilterInPlace(predicate);
            return(ret);
        }
コード例 #2
0
ファイル: CSVData.cs プロジェクト: akankshvashisth/CSVData
        public static CSVData Filter(CSVData data, Func <Dictionary <string, string>, bool> predicate)
        {
            CSVData ret = new CSVData(data);

            ret.FilterInPlace(predicate);
            return(ret);
        }
コード例 #3
0
ファイル: CSVData.cs プロジェクト: akankshvashisth/CSVData
        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);
        }