Esempio n. 1
0
 public DatasetExportDialog(DatasetEventsViewModel datasetEventsView)
 {
     _viewModel = new DatasetExportViewModel(datasetEventsView);
     this.InitializeComponent();
 }
        private async void MenuExport_ClickAsync(object sender, RoutedEventArgs e)
        {
            // Check and see if there are unsaved changes
            if (_viewModel.IsEventsModified)
            {
                await ClosePageAsync();
            }
            DatasetExportDialog dialog = new DatasetExportDialog(_viewModel);
            var result = await dialog.ShowAsync();

            if (result == ContentDialogResult.Primary)
            {
                StorageFolder          folder = dialog.ExportFolder;
                DatasetExportViewModel datasetExportConfig = dialog.DatasetExportConfiguration;
                if (datasetExportConfig.ExportInCSV)
                {
                    // Dataset exported in csv events, where metadata about the dataset is stored in json file.
                    StorageFolder targetDatasetFolder;
                    try
                    {
                        targetDatasetFolder = await folder.GetFolderAsync(datasetExportConfig.DatasetName);

                        string    message   = "A folder named " + datasetExportConfig.DatasetName + " already existed at " + folder.Path + ". Do you want to overwrite?";
                        var       dlg       = new MessageDialog(message, "Overwrite Folder?");
                        UICommand yesCmd    = new UICommand("Yes");
                        UICommand cancelCmd = new UICommand("Cancel");
                        dlg.Commands.Add(yesCmd);
                        dlg.Commands.Add(cancelCmd);
                        dlg.DefaultCommandIndex = 1;
                        dlg.CancelCommandIndex  = 1;
                        var cmd = await dlg.ShowAsync();

                        if (cmd == cancelCmd)
                        {
                            return;
                        }
                    }
                    catch (Exception)
                    { }
                    targetDatasetFolder = await folder.CreateFolderAsync(datasetExportConfig.DatasetName, CreationCollisionOption.ReplaceExisting);

                    PageBusy(string.Format("Exporting dataset {0} to folder {1}", datasetExportConfig.DatasetName, targetDatasetFolder.Path));
                    if (datasetExportConfig.ExportDateSelectionEnabled)
                    {
                        // Copy all files
                        foreach (var datasetFile in await _viewModel.Dataset.Folder.GetFilesAsync())
                        {
                            if (datasetFile.FileType == ".csv")
                            {
                                List <string> eventStringList = new List <string>();
                                // Open file, read each line, parse the time. If the time is inbetween the start date and stop date, write the line back to file.
                                using (var inputStream = await datasetFile.OpenReadAsync())
                                    using (var classicStream = inputStream.AsStreamForRead())
                                        using (var streamReader = new StreamReader(classicStream))
                                        {
                                            int lineNo = 0;
                                            while (streamReader.Peek() >= 0)
                                            {
                                                string curEventString = streamReader.ReadLine();
                                                if (string.IsNullOrWhiteSpace(curEventString))
                                                {
                                                    continue;
                                                }
                                                try
                                                {
                                                    string [] tokenList = curEventString.Split(new char[] { ',' });
                                                    // Get the Date of the String and add to dictionary
                                                    DateTimeOffset curEventTimeTag = DateTimeOffset.Parse(tokenList[0]);
                                                    if (curEventTimeTag.Date >= datasetExportConfig.ExportStartDate && curEventTimeTag.Date <= datasetExportConfig.ExportStopDate)
                                                    {
                                                        eventStringList.Add(curEventString);
                                                    }
                                                    if (curEventTimeTag.Date > datasetExportConfig.ExportStopDate)
                                                    {
                                                        break;
                                                    }
                                                    lineNo++;
                                                }
                                                catch (Exception except)
                                                {
                                                    Logger.Instance.Error(this.GetType().Name, string.Format("Failed at line {0} with error message {1}", lineNo, except.Message));
                                                }
                                            }
                                        }
                                StorageFile newDatasetFile = await targetDatasetFolder.CreateFileAsync(datasetFile.Name, CreationCollisionOption.ReplaceExisting);

                                using (var outputStream = await newDatasetFile.OpenAsync(FileAccessMode.ReadWrite))
                                    using (var classicStream = outputStream.AsStreamForWrite())
                                        using (var streamWriter = new StreamWriter(classicStream))
                                        {
                                            foreach (string eventString in eventStringList)
                                            {
                                                streamWriter.WriteLine(eventString);
                                            }
                                        }
                            }
                            else if (datasetFile.FileType == ".json")
                            {
                                await datasetFile.CopyAsync(targetDatasetFolder, datasetFile.Name, NameCollisionOption.ReplaceExisting);
                            }
                        }
                    }
                    else
                    {
                        // Copy all files
                        foreach (var datasetFile in await _viewModel.Dataset.Folder.GetFilesAsync())
                        {
                            await datasetFile.CopyAsync(targetDatasetFolder, datasetFile.Name, NameCollisionOption.ReplaceExisting);
                        }
                    }
                    // Change name of the copied metadata file
                    if (datasetExportConfig.DatasetRenameEnabled)
                    {
                        Dataset dataset = await Dataset.LoadMetadataFromFolderAsync(targetDatasetFolder);

                        dataset.Name = datasetExportConfig.DatasetName;
                        await dataset.WriteMetadataToFolderAsync();
                    }
                    PageReady();
                    return;
                }
                if (datasetExportConfig.ExportInTxt)
                {
                    // For backward compatibility, one can export the dataset in old-style txt format.
                    string      txtFileName    = datasetExportConfig.DatasetName + "_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
                    StorageFile newDatasetFile = await folder.CreateFileAsync(txtFileName, CreationCollisionOption.ReplaceExisting);

                    PageBusy(string.Format("Exporting dataset {0} to {1}", datasetExportConfig.DatasetName, newDatasetFile.Path));
                    List <string>        eventStringList = new List <string>();
                    SensorEventViewModel sensorEvent     = _viewModel.ParseSensorEventFromString(_viewModel.AllEventsStringList[0]);
                    SensorEventViewModel nextSensorEvent;
                    string previousActivity = "";
                    for (int idEvent = 0; idEvent < _viewModel.AllEventsStringList.Count; idEvent++)
                    {
                        nextSensorEvent = (idEvent == _viewModel.AllEventsStringList.Count - 1) ? null :
                                          _viewModel.ParseSensorEventFromString(_viewModel.AllEventsStringList[idEvent + 1]);
                        if (sensorEvent.TimeTag.Date >= datasetExportConfig.ExportStartDate &&
                            sensorEvent.TimeTag.Date <= datasetExportConfig.ExportStopDate)
                        {
                            string annotationString = "";
                            if (sensorEvent.Activity.Name != "Other_Activity")
                            {
                                if (sensorEvent.Activity.Name != previousActivity)
                                {
                                    annotationString = sensorEvent.Activity.Name + "=\"begin\"";
                                }
                                else if (nextSensorEvent == null)
                                {
                                    annotationString = sensorEvent.Activity.Name + "=\"end\"";
                                }
                                else if (nextSensorEvent.Activity.Name != sensorEvent.Activity.Name)
                                {
                                    annotationString = sensorEvent.Activity.Name + "=\"end\"";
                                }
                            }
                            eventStringList.Add(
                                sensorEvent.TimeTag.ToString("yyyy-MM-dd") + "\t" +
                                sensorEvent.TimeTag.ToString("HH:mm:ss.ffffff") + "\t" +
                                sensorEvent.Sensor.Name + "\t" +
                                sensorEvent.SensorState + "\t" +
                                annotationString
                                );
                            previousActivity = sensorEvent.Activity.Name;
                        }
                        if (sensorEvent.TimeTag.Date > datasetExportConfig.ExportStopDate)
                        {
                            break;
                        }
                        sensorEvent = nextSensorEvent;
                    }
                    using (var outputStream = await newDatasetFile.OpenAsync(FileAccessMode.ReadWrite))
                        using (var classicStream = outputStream.AsStreamForWrite())
                            using (var streamWriter = new StreamWriter(classicStream))
                            {
                                foreach (string eventString in eventStringList)
                                {
                                    streamWriter.WriteLine(eventString);
                                }
                            }
                    PageReady();
                    return;
                }
            }
        }