/// <summary>
        /// Serializes an object using MiniJSON and writes to a given path
        /// </summary>
        /// <param name="destFileName"></param>
        /// <param name="serializableObject"></param>
        public void WriteJson(object serializableObject, WriteFileInfo writeFileInfo)
        {
            string ppJson = MiniJSON.Json.Serialize(serializableObject);

            File.WriteAllText(writeFileInfo.FullPath, ppJson);
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }
        /// <summary>
        /// Writes a DataTable to file to a path.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="fpath"></param>
        public void WriteCSV(DataTable data, WriteFileInfo writeFileInfo)
        {
            var writer = new CSVFile.CSVWriter(writeFileInfo.FullPath);

            writer.Write(data, true);
            writer.Dispose();
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }
        /// <summary>
        /// Writes a list of string arrays with a given header to a file at given path.
        /// </summary>
        /// <param name="header">Row of headers</param>
        /// <param name="data"></param>
        /// <param name="fpath"></param>
        public void WriteCSV(string[] header, IList <string[]> data, WriteFileInfo writeFileInfo)
        {
            string[] csvRows = new string[data.Count + 1];
            csvRows[0] = string.Join(",", header);
            for (int i = 1; i <= data.Count; i++)
            {
                csvRows[i] = string.Join(",", data[i - 1]);
            }

            File.WriteAllLines(writeFileInfo.FullPath, csvRows);
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }
示例#4
0
        /// <summary>
        /// Writes trial data (List of OrderedResultsDict) to file at fpath
        /// </summary>
        /// <param name="dictList"></param>
        /// <param name="fpath"></param>
        public void WriteTrials(List <ResultsDictionary> dictList, WriteFileInfo writeFileInfo)
        {
            // generate list of all headers possible
            // hashset keeps unique set of keys
            HashSet <string> headers = new HashSet <string>();

            foreach (ResultsDictionary dict in dictList)
            {
                if (dict != null)
                {
                    foreach (string key in dict.Keys)
                    {
                        headers.Add(key);
                    }
                }
            }

            // final output: array of rows (comma-separated strings)
            string[] csvRows = new string[dictList.Count + 1];

            // first row: headers
            csvRows[0] = string.Join(",", headers.ToArray());

            for (int i = 0; i < dictList.Count; i++)
            {
                ResultsDictionary dict = dictList[i];
                if (dict == null)
                {
                    continue;               // empty trial, try next loop iteration
                }
                // add all observations to the row, in correct order.
                // check if null, if so assign to empty string (?? operator)
                var row = headers
                          .Select(header =>
                {
                    object val;
                    try { val = dict[header]; }
                    catch (KeyNotFoundException) { val = string.Empty; }
                    if (val == null)
                    {
                        val = string.Empty;
                    }
                    return(val.ToString());
                }
                                  );

                // join to string & store in output
                csvRows[i + 1] = string.Join(",", row.ToArray());
            }

            File.WriteAllLines(writeFileInfo.FullPath, csvRows);
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }
示例#5
0
        public void CommitCSV()
        {
            FileInfo fileInfo = new FileInfo(ppListPath);

            WriteFileInfo writeFileInfo = new WriteFileInfo(
                WriteFileType.ParticipantList,
                fileInfo.DirectoryName,
                fileInfo.Name
                );

            fileIOManager.WriteCSV(ppList, writeFileInfo);
            Debug.Log(string.Format("Updating: {0}", ppListPath));
        }
示例#6
0
        void SaveResults()
        {
            List <ResultsDictionary> results = Trials.Select(t => t.result).ToList();
            string        fileName           = "trial_results.csv";
            WriteFileInfo fileInfo           = new WriteFileInfo(
                WriteFileType.Trials,
                BasePath,
                experimentName,
                ppid,
                FolderName,
                fileName
                );

            fileIOManager.ManageInWorker(() => fileIOManager.WriteTrials(results, fileInfo));
        }
示例#7
0
        /// <summary>
        /// Finalises the session logger, saving the data and detaching its logging method from handling Debug.Log messages
        /// </summary>
        public void Finalise()
        {
            WriteFileInfo fileInfo = new WriteFileInfo(
                WriteFileType.Log,
                session.BasePath,
                session.experimentName,
                session.ppid,
                session.FolderName,
                "log.csv"
                );

            fileIOManager.ManageInWorker(() => fileIOManager.WriteCSV(table, fileInfo));
            Application.logMessageReceived -= HandleLog;
            session.cleanUp -= Finalise;
        }
示例#8
0
        void SaveResults()
        {
            List <OrderedResultDict> results = trials.Select(t => t.result).ToList();
            string fileName = "trial_results.csv";

            WriteFileInfo fileInfo = new WriteFileInfo(
                WriteFileType.Trials,
                this.basePath,
                experimentName,
                ppid,
                folderName,
                fileName
                );

            fileIOManager.ManageInWorker(() => fileIOManager.WriteTrials(results, headers.ToArray(), fileInfo));
        }
        /// <summary>
        /// Writes trial data (List of OrderedResultsDict) to file at fpath
        /// </summary>
        /// <param name="dataDict"></param>
        /// <param name="headers"></param>
        /// <param name="fpath"></param>
        public void WriteTrials(List <OrderedResultDict> dataDict, string[] headers, WriteFileInfo writeFileInfo)
        {
            string[] csvRows = new string[dataDict.Count + 1];
            csvRows[0] = string.Join(",", headers.ToArray());
            object[] row = new object[headers.Length];

            for (int i = 1; i <= dataDict.Count; i++)
            {
                OrderedResultDict dict = dataDict[i - 1];
                if (dict != null)
                {
                    dict.Values.CopyTo(row, 0);
                    csvRows[i] = string.Join(",", row.Select(v => System.Convert.ToString(v)).ToArray());
                }
            }

            File.WriteAllLines(writeFileInfo.FullPath, csvRows);
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }
示例#10
0
        /// <summary>
        /// Save tracking data for this trial
        /// </summary>
        /// <param name="tracker">The tracker to take data from to save</param>
        /// <returns>Name of the saved file</returns>
        public string SaveTrackerData(Tracker tracker)
        {
            string fname = string.Format("{0}_{1}_T{2:000}.csv", tracker.objectName, tracker.measurementDescriptor, currentTrialNum);

            WriteFileInfo fileInfo = new WriteFileInfo(
                WriteFileType.Tracker,
                this.basePath,
                experimentName,
                ppid,
                folderName,
                fname
                );

            List <string[]> dataCopy = tracker.GetDataCopy();

            fileIOManager.ManageInWorker(() => fileIOManager.WriteCSV(tracker.header, dataCopy, fileInfo));

            // return name of the file so it can be stored in behavioural data
            return(fileInfo.FileName);
        }
示例#11
0
        /// <summary>
        /// Write a dictionary object to a JSON file in the session folder (in a new FileIOManager thread)
        /// </summary>
        /// <param name="dict">Dictionary object to write</param>

        /// <param name="objectName">Name of the object (is used for file name)</param>
        public void WriteDictToSessionFolder(Dictionary <string, object> dict, string objectName)
        {
            if (hasInitialised)
            {
                string fileName = string.Format("{0}.json", objectName);

                WriteFileInfo fileInfo = new WriteFileInfo(
                    WriteFileType.Dictionary,
                    this.basePath,
                    experimentName,
                    ppid,
                    folderName,
                    fileName
                    );

                fileIOManager.ManageInWorker(() => fileIOManager.WriteJson(dict, fileInfo));
            }
            else
            {
                throw new System.InvalidOperationException("Can't write dictionary before session has initalised!");
            }
        }
示例#12
0
        void CreateNewPPList(string filePath)
        {
            // create example table
            DataTable exampleData = new DataTable();

            // create headers
            foreach (var header in startup.participantDataPoints.Select(x => x.internalName))
            {
                exampleData.Columns.Add(new DataColumn(header, typeof(string)));
            }

            // create example row
            DataRow row1 = exampleData.NewRow();

            foreach (var dataPoint in startup.participantDataPoints)
            {
                row1[dataPoint.internalName] = dataPoint.controller.GetDefault();
            }
            row1["ppid"] = "test";

            exampleData.Rows.Add(row1);

            FileInfo fileInfo = new FileInfo(filePath);

            WriteFileInfo writeFileInfo = new WriteFileInfo(
                WriteFileType.ParticipantList,
                fileInfo.DirectoryName,
                fileInfo.Name
                );

            // save, this is single threaded in this case
            fileIOManager.WriteCSV(exampleData, writeFileInfo);

            // re-read it back in
            CheckSetList(filePath);
        }
        /// <summary>
        /// Writes trial data (List of OrderedResultsDict) to file at fpath
        /// </summary>
        /// <param name="dictList"></param>
        /// <param name="fpath"></param>
        public void WriteTrials(List <ResultsDictionary> dictList, WriteFileInfo writeFileInfo)
        {
            // generate list of all headers possible
            // hashset keeps unique set of keys
            HashSet <string> headers = new HashSet <string>();

            foreach (ResultsDictionary dict in dictList)
            {
                if (dict != null)
                {
                    foreach (string key in dict.Keys)
                    {
                        headers.Add(key);
                    }
                }
            }

            // final output: array of rows (comma-separated strings)
            string[] csvRows = new string[dictList.Count + 1];

            // first row: headers
            csvRows[0] = string.Join(",", headers.ToArray());

            for (int i = 0; i < dictList.Count; i++)
            {
                ResultsDictionary dict = dictList[i];
                if (dict == null)
                {
                    continue;               // empty trial, try next loop iteration
                }
                // add all observations to the row, in correct order.
                // check if null, if so assign to empty string
                var row = headers
                          .Select(header =>
                {
                    object val;
                    try { val = dict[header]; }
                    catch (KeyNotFoundException) { val = string.Empty; }
                    if (val == null)
                    {
                        val = string.Empty;
                    }
                    string stringValue = val.ToString();

                    // check for commas
                    // commas not allowed in CSV format, as they are parsed as new rows
                    if (stringValue.Contains(','))
                    {
                        Debug.LogWarningFormat(
                            "Replacing comma characters (',') in value '{0}' (result[\"{1}\"] in trial {2}) with '_' character. Reason: Comma characters not allowed in values in CSV file.",
                            stringValue, header, i
                            );
                        stringValue = stringValue.Replace(',', '_');
                    }
                    return(stringValue);
                }
                                  );

                // join to string & store in output
                csvRows[i + 1] = string.Join(",", row.ToArray());
            }

            File.WriteAllLines(writeFileInfo.FullPath, csvRows);
            executeOnMainThreadQueue.Enqueue(() => onWriteFile.Invoke(writeFileInfo));
        }