static void Main(string[] args) { Console.Error.WriteLine("Tcx To Csv Application"); string fileName = null; if (args.Length < 1) { Console.Error.WriteLine("Usage: Tcx2Csv.exe <filename> "); return; } fileName = args[0]; try { var parser = new TcxParser(); var activities = parser.Parse(fileName); if (activities == null) { Console.Error.WriteLine($"Invalid Tcx file '{fileName}' "); return; } if (!activities.Any()) { Console.Error.WriteLine($"No activities found in Tcx file '{fileName}' "); return; } int iA = 0; foreach (var activity in activities) { iA++; string outFilePath = findOutfileName(fileName, activity); var allTrackPoints = activity.Laps.SelectMany((lap, i) => lap.Track.TrackPoints.Select(t => new { Lap = lap, LapIndex = i, TrackPoint = t })).ToList(); allTrackPoints = allTrackPoints.OrderBy(t => t.TrackPoint.Time).ToList(); if (!allTrackPoints.Any()) { Console.Error.WriteLine($"No track data found in activity {iA} Tcx file '{fileName}' "); continue; } var headers = $"LapIndex\t{nameof(Lap.Name)}\t{nameof(TrackPoint.Time)}\t{nameof(TrackPoint.DistanceMeters)}\t{nameof(TrackPoint.Speed)}\t{nameof(TrackPoint.AltitudeMeters)}\t{nameof(TrackPoint.HeartRateBpm)}"; var lines = new string[] { headers }.ToList(); lines.AddRange( allTrackPoints.Select(t => $"{t.LapIndex}\t{t.Lap.Name}\t{t.TrackPoint.Time}\t{t.TrackPoint.DistanceMeters}\t{t.TrackPoint.Speed}\t{t.TrackPoint.AltitudeMeters}\t{t.TrackPoint.HeartRateBpm}") ); File.WriteAllLines(outFilePath, lines); Console.Error.WriteLine($"{activity.Sport} Activity from {activity.Laps.Min(l => l.StartTime)} with {activity.Laps.Count()} and {lines.Count - 1} trackPoints (max distance {allTrackPoints.Max(t => t.TrackPoint.DistanceMeters)}m) written to '{outFilePath}' "); } } catch (Exception ex) { Console.Error.WriteLine($"Exception parsing '{fileName}': {ex.ToString()}"); } }
public TcxChartViewModel() { if (!Directory.Exists(sourceDirectory)) { Directory.CreateDirectory(sourceDirectory); } if (!Directory.Exists(targetDirectory)) { Directory.CreateDirectory(targetDirectory); } var sourceFiles = Directory.GetFiles(sourceDirectory, "*.tcx").ToList(); var targetFiles = Directory.GetFiles(targetDirectory, "*.tcx").ToList(); var files = sourceFiles.ToList(); files.AddRange(targetFiles); var activities = new List <ActivityViewModel>(); foreach (var file in files) { try { var loadedActivities = new TcxParser().Parse(file); if (loadedActivities != null) { activities.AddRange(loadedActivities.Select(a => new ActivityViewModel(file, a))); } } catch (Exception e) { } } sourceFiles = Directory.GetFiles(sourceDirectory, "*.tcxml").ToList(); targetFiles = Directory.GetFiles(targetDirectory, "*.tcxml").ToList(); files = sourceFiles.ToList(); files.AddRange(targetFiles); foreach (var file in files) { try { var loadedActivities = loadActivities(file); if (loadedActivities != null) { activities.AddRange(loadedActivities.Select(a => new ActivityViewModel(file, a))); } } catch { } } var groupedActivities = activities.GroupBy(a => a.StartTime); var newestActivities = groupedActivities.Select(g => g.OrderByDescending(a => new FileInfo(a.FileName).LastWriteTime).First()); foreach (var newestActivity in newestActivities.OrderByDescending(a => a.StartTime)) { Activities.Add(newestActivity); newestActivity.PropertyChanged += someActivityChanged; } SelectedSportTypes.AddRange(SportTypes); }