예제 #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 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);
        }