示例#1
0
        void Run(string[] args)
        {
            // Read the command line
            if (args.Length < 1)
            {
                WriteLine("Invalid args");
                WriteLine(formatString);
                return;
            }

            ReadCommandLine(args);

            string csvOutFilename = GetArg("o", false);

            if (csvOutFilename.Length == 0)
            {
                WriteLine("Missing -o arg");
                WriteLine(formatString);
                return;
            }

            // Set the title
            string title = GetArg("title", false);

            if (title.Length == 0)
            {
                title = MakeShortFilename(csvOutFilename).ToLower().Replace(".csv", "");
            }
            char c = title[0];

            c     = char.ToUpper(c);
            title = c + title.Substring(1);

            string filterOutlierStat      = GetArg("filterOutlierStat", false);
            float  filterOutlierThreshold = GetFloatArg("filterOutlierThreshold", 1000.0f);

            // Whether or not we want stats to be averaged rather than appended
            bool bAverage = GetBoolArg("avg");

            string csvDir          = GetArg("csvDir");
            string csvFilenamesStr = GetArg("csvs", false);

            if (csvDir == null && csvFilenamesStr == null)
            {
                WriteLine("-csvs or -csvdir is required");
                WriteLine(formatString);
                return;
            }

            string searchPattern = GetArg("searchPattern", null);

            if (csvFilenamesStr.Contains("*"))
            {
                // If passed a wildcard to -csvs, this is equivalent to -csvdir . -searchpattern <csvs>
                if (csvDir != null && csvDir != "")
                {
                    throw new Exception("Can't use -csvs with -csvdir");
                }
                csvDir        = ".";
                searchPattern = csvFilenamesStr;
            }

            // Read CSV filenames from a directory or list
            string[] csvFilenames;
            if (csvDir.Length > 0)
            {
                if (searchPattern == null)
                {
                    searchPattern = "*.csv";
                }
                DirectoryInfo di       = new DirectoryInfo(csvDir);
                bool          bRecurse = GetBoolArg("recurse");
                var           files    = di.GetFiles(searchPattern, bRecurse ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
                csvFilenames = new string[files.Length];
                int i = 0;
                foreach (FileInfo csvFile in files)
                {
                    csvFilenames[i] = csvFile.FullName;
                    i++;
                }
            }
            else
            {
                if (csvFilenamesStr.Length == 0)
                {
                    System.Console.Write(formatString);
                    return;
                }
                csvFilenames = csvFilenamesStr.Split(';');
            }

            Console.WriteLine("Collating " + csvFilenames.Length + " csvs:");
            foreach (string csvFilename in csvFilenames)
            {
                Console.WriteLine("  " + csvFilename);
            }
            Console.WriteLine("");

            CsvStats combinedCsvStats = new CsvStats();


            string        metadataFilterString = GetArg("metadataFilter", null);
            List <int>    frameCsvCounts       = new List <int>();
            List <string> allCsvFilenames      = new List <string>();
            int           csvIndex             = 0;

            foreach (string csvFilename in csvFilenames)
            {
                CsvStats srcCsvStats = CsvStats.ReadCSVFile(csvFilename, null);

                // Check for outliers
                bool skip = false;
                if (filterOutlierStat != null)
                {
                    StatSamples outlierStat = srcCsvStats.GetStat(filterOutlierStat);
                    if (outlierStat != null)
                    {
                        foreach (float sample in outlierStat.samples)
                        {
                            if (sample > filterOutlierThreshold)
                            {
                                WriteLine("CSV " + csvFilename + " ignored due to bad " + filterOutlierStat + " value: " + sample);
                                skip = true;
                                break;
                            }
                        }
                    }
                }
                if (metadataFilterString != null)
                {
                    if (srcCsvStats.metaData == null || !CsvStats.DoesMetadataMatchFilter(srcCsvStats.metaData, metadataFilterString))
                    {
                        WriteLine("Skipping CSV " + csvFilename + " due to metadata filter");
                        skip = true;
                    }
                }
                if (skip)
                {
                    continue;
                }

                // Add the CSV filename as the first event if we're not averaging
                if (!bAverage)
                {
                    CsvEvent firstEvent = new CsvEvent();
                    firstEvent.Frame = 0;
                    firstEvent.Name  = "CSV:" + MakeShortFilename(csvFilename).Replace(' ', '_').Replace(',', '_').Replace('\n', '_');
                    srcCsvStats.Events.Insert(0, firstEvent);
                }

                // Combine the stats
                if (csvIndex == 0)
                {
                    combinedCsvStats = srcCsvStats;
                }
                else
                {
                    CsvMetadata metadataA = combinedCsvStats.metaData;
                    CsvMetadata metadataB = srcCsvStats.metaData;

                    // If there is metadata, it should match
                    if (metadataA != null || metadataB != null)
                    {
                        metadataA.CombineAndValidate(metadataB);
                    }
                    combinedCsvStats.Combine(srcCsvStats, bAverage, false);
                }

                // If we're computing the average, update the counts for each frame
                if (bAverage)
                {
                    // Resize frameCsvCounts if necessary
                    for (int i = frameCsvCounts.Count; i < combinedCsvStats.SampleCount; i++)
                    {
                        frameCsvCounts.Add(0);
                    }
                    for (int i = 0; i < srcCsvStats.SampleCount; i++)
                    {
                        frameCsvCounts[i] += 1;
                    }
                }

                allCsvFilenames.Add(Path.GetFileName(csvFilename));
                csvIndex++;
                WriteLine("Csvs Processed: " + csvIndex + " / " + csvFilenames.Length);
            }


            if (bAverage)
            {
                // Divide all samples by the total number of CSVs
                foreach (StatSamples stat in combinedCsvStats.Stats.Values)
                {
                    for (int i = 0; i < stat.samples.Count; i++)
                    {
                        stat.samples[i] /= (float)(frameCsvCounts[i]);
                    }
                }

                // Add a stat for the csv count
                string csvCountStatName = "csvCount";
                if (!combinedCsvStats.Stats.ContainsKey(csvCountStatName))
                {
                    StatSamples csvCountStat = new StatSamples(csvCountStatName);
                    foreach (int count in frameCsvCounts)
                    {
                        csvCountStat.samples.Add((int)count);
                    }
                    combinedCsvStats.Stats.Add(csvCountStatName, csvCountStat);
                }
                if (combinedCsvStats.metaData != null)
                {
                    // Add some metadata
                    combinedCsvStats.metaData.Values.Add("Averaged", allCsvFilenames.Count.ToString());
                    combinedCsvStats.metaData.Values.Add("SourceFiles", string.Join(";", allCsvFilenames));
                }
            }

            combinedCsvStats.ComputeAveragesAndTotal();

            // Write the csv stats to a CSV
            combinedCsvStats.WriteToCSV(csvOutFilename);
        }
示例#2
0
        void Run(string[] args)
        {
            // Read the command line
            if (args.Length < 1)
            {
                WriteLine("Invalid args");
                WriteLine(formatString);
                return;
            }

            ReadCommandLine(args);

            string csvFilename = GetArg("csv", true);

            if (csvFilename.Length == 0)
            {
                System.Console.Write(formatString);
                return;
            }

            string splitStat = GetArg("splitStat").ToLower(); // We write a CSV out for every value of this that we encounter

            if (splitStat.Length == 0)
            {
                System.Console.Write(formatString);
                return;
            }

            string csvOutFilename = GetArg("o", false);

            if (csvOutFilename.Length == 0)
            {
                int dotIndex = csvFilename.LastIndexOf('.');
                csvOutFilename = csvFilename.Substring(0, dotIndex);
            }

            int  delay          = GetIntArg("delay", 0); // We delay by this many frames
            bool bVirtualEvents = GetBoolArg("virtualEvents");

            // Read the CSV
            CsvStats csvStats = CsvStats.ReadCSVFile(csvFilename, null);

            List <CsvStats>         csvStatsOutList       = new List <CsvStats>();
            List <float>            uniqueValues          = new List <float>();
            Dictionary <float, int> switchValueToCsvIndex = new Dictionary <float, int>();

            StatSamples [] statSamples       = csvStats.Stats.Values.ToArray();
            StatSamples    switchStatSamples = csvStats.GetStat(splitStat);

            if (switchStatSamples == null)
            {
                System.Console.WriteLine("Split stat '" + switchStatSamples + "' not found");
                return;
            }

            StatSamples[] sourceStats = csvStats.Stats.Values.ToArray();

            List <int> SourceFrameToDestFrameIndex = new List <int>();
            List <int> SourceFrameToDestCsvIndex   = new List <int>();

            for (int i = delay; i < switchStatSamples.samples.Count; i++)
            {
                float switchValue = switchStatSamples.samples[i - delay];

                // Find the CSV stats for this value, or create it if it doesn't exist
                CsvStats destStats;
                if (!switchValueToCsvIndex.ContainsKey(switchValue))
                {
                    destStats = new CsvStats();

                    // Create a new CsvStats as a copy of csvStats but with no samples
                    destStats.metaData = csvStats.metaData;
                    foreach (StatSamples stat in sourceStats)
                    {
                        StatSamples newStat = new StatSamples(stat, false);
                        destStats.AddStat(newStat);
                    }
                    switchValueToCsvIndex.Add(switchValue, csvStatsOutList.Count);
                    csvStatsOutList.Add(destStats);
                    uniqueValues.Add(switchValue);
                }
                else
                {
                    destStats = csvStatsOutList[switchValueToCsvIndex[switchValue]];
                }

                // Add the samples to the current destination
                int index = 0;
                foreach (StatSamples destStat in destStats.Stats.Values.ToArray())
                {
                    if (i < sourceStats[index].samples.Count)
                    {
                        destStat.samples.Add(sourceStats[index].samples[i]);
                    }
                    index++;
                }

                int DestCsvIndex   = switchValueToCsvIndex[switchValue];
                int DestFrameIndex = destStats.SampleCount - 1;

                SourceFrameToDestFrameIndex.Add(DestFrameIndex);
                SourceFrameToDestCsvIndex.Add(DestCsvIndex);
            }


            for (int i = 0; i < csvStats.Events.Count; i++)
            {
                CsvEvent ev         = csvStats.Events[i];
                int      eventFrame = ev.Frame - delay;
                if (eventFrame > 0)
                {
                    int      destCsvIndex = SourceFrameToDestCsvIndex[eventFrame];
                    CsvStats destStats    = csvStatsOutList[destCsvIndex];
                    CsvEvent newEvent     = new CsvEvent(ev.Name, SourceFrameToDestFrameIndex[ev.Frame]);
                    destStats.Events.Add(ev);

                    if (bVirtualEvents)
                    {
                        // Write the event to the other CSVs with [VIRTUAL]
                        for (int j = 0; j < csvStatsOutList.Count; j++)
                        {
                            if (j != destCsvIndex)
                            {
                                CsvEvent newEvent2 = new CsvEvent(ev.Name + " [VIRTUAL]", newEvent.Frame);
                                destStats.Events.Add(newEvent2);
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < csvStatsOutList.Count; i++)
            {
                // Write the csv stats to a CSV
                csvStatsOutList[i].WriteToCSV(csvOutFilename + "_" + splitStat + "_" + uniqueValues[i] + ".csv");
            }
        }
示例#3
0
        void Run(string[] args)
        {
            // Read the command line
            if (args.Length < 1)
            {
                WriteLine("Invalid args");
                WriteLine(formatString);
                return;
            }

            ReadCommandLine(args);

            string csvOutFilename = GetArg("o", false);

            if (csvOutFilename.Length == 0)
            {
                WriteLine("Missing -o arg");
                WriteLine(formatString);
                return;
            }

            // Set the title
            string title = GetArg("title", false);

            if (title.Length == 0)
            {
                title = MakeShortFilename(csvOutFilename).ToLower().Replace(".csv", "");
            }
            char c = title[0];

            c     = char.ToUpper(c);
            title = c + title.Substring(1);

            string filterOutlierStat      = GetArg("filterOutlierStat", false);
            float  filterOutlierThreshold = GetFloatArg("filterOutlierThreshold", 1000.0f);

            // Whether or not we want stats to be averaged rather than appended
            bool bAverage = GetBoolArg("avg");

            // Read CSV filenames from a directory or list
            string[] csvFilenames;
            string   csvDir = GetArg("csvDir");

            if (csvDir.Length > 0)
            {
                DirectoryInfo di    = new DirectoryInfo(csvDir);
                var           files = di.GetFiles("*.csv", SearchOption.AllDirectories);
                csvFilenames = new string[files.Length];
                int i = 0;
                foreach (FileInfo csvFile in files)
                {
                    csvFilenames[i] = csvFile.FullName;
                    i++;
                }
            }
            else
            {
                string csvFilenamesStr = GetArg("csvs", true);
                if (csvFilenamesStr.Length == 0)
                {
                    System.Console.Write(formatString);
                    return;
                }
                csvFilenames = csvFilenamesStr.Split(';');
            }

            CsvStats combinedCsvStats = new CsvStats();

            // List of stats to be averaged
            //CsvStats[] statsToAvg = new CsvStats[csvFilenames.Length];

            // Read all the CSVs into one big CSVStats class
            List <int>    frameCsvCounts  = new List <int>();
            List <string> allCsvFilenames = new List <string>();
            int           csvIndex        = 0;

            foreach (string csvFilename in csvFilenames)
            {
                CsvStats srcCsvStats = CsvStats.ReadCSVFile(csvFilename, null);

                // Check for outliers
                bool skip = false;
                if (filterOutlierStat != null)
                {
                    StatSamples outlierStat = srcCsvStats.GetStat(filterOutlierStat);
                    if (outlierStat != null)
                    {
                        foreach (float sample in outlierStat.samples)
                        {
                            if (sample > filterOutlierThreshold)
                            {
                                WriteLine("CSV " + csvFilename + " ignored due to bad " + filterOutlierStat + " value: " + sample);
                                skip = true;
                                break;
                            }
                        }
                    }
                }
                if (skip)
                {
                    continue;
                }

                // Add the CSV filename as the first event if we're not averaging
                if (!bAverage)
                {
                    CsvEvent firstEvent = new CsvEvent();
                    firstEvent.Frame = 0;
                    firstEvent.Name  = "CSV:" + MakeShortFilename(csvFilename).Replace(' ', '_').Replace(',', '_').Replace('\n', '_');
                    srcCsvStats.Events.Insert(0, firstEvent);
                }

                // Combine the stats
                if (csvIndex == 0)
                {
                    combinedCsvStats = srcCsvStats;
                }
                else
                {
                    CsvMetadata metadataA = combinedCsvStats.metaData;
                    CsvMetadata metadataB = srcCsvStats.metaData;

                    // If there is metadata, it should match
                    if (metadataA != null || metadataB != null)
                    {
                        metadataA.CombineAndValidate(metadataB);
                    }
                    combinedCsvStats.Combine(srcCsvStats, bAverage, false);
                    if (bAverage)
                    {
                        // Resize the framecount array to match
                        for (int i = frameCsvCounts.Count; i < combinedCsvStats.SampleCount; i++)
                        {
                            frameCsvCounts.Add(0);
                        }
                        for (int i = 0; i < srcCsvStats.SampleCount; i++)
                        {
                            frameCsvCounts[i] += 1;
                        }
                    }
                }
                allCsvFilenames.Add(Path.GetFileName(csvFilename));
                WriteLine("Csvs Processed: " + csvIndex + " / " + csvFilenames.Length);
                csvIndex++;
            }

            if (bAverage)
            {
                // Divide all samples by the total number of CSVs
                foreach (StatSamples stat in combinedCsvStats.Stats.Values)
                {
                    for (int i = 0; i < stat.samples.Count; i++)
                    {
                        stat.samples[i] /= (float)(frameCsvCounts[i]);
                    }
                }

                // Add a stat for the csv count
                string csvCountStatName = "csvCount";
                if (!combinedCsvStats.Stats.ContainsKey(csvCountStatName))
                {
                    StatSamples csvCountStat = new StatSamples(csvCountStatName);
                    foreach (int count in frameCsvCounts)
                    {
                        csvCountStat.samples.Add((int)count);
                    }
                    combinedCsvStats.Stats.Add(csvCountStatName, csvCountStat);
                }
                if (combinedCsvStats.metaData != null)
                {
                    // Add some metadata
                    combinedCsvStats.metaData.Values.Add("Averaged", allCsvFilenames.Count.ToString());
                    combinedCsvStats.metaData.Values.Add("SourceFiles", string.Join(";", allCsvFilenames));
                }
            }

            combinedCsvStats.ComputeAveragesAndTotal();

            // Write the csv stats to a CSV
            combinedCsvStats.WriteToCSV(csvOutFilename);
        }