|
8 | 8 | using System.Globalization; |
9 | 9 | using System.IO; |
10 | 10 | using System.Linq; |
| 11 | +using System.Runtime.InteropServices; |
11 | 12 | using System.Text.RegularExpressions; |
12 | 13 | using System.Threading.Tasks; |
13 | 14 |
|
@@ -37,14 +38,21 @@ public async void BtnSearch_Click(object sender, RoutedEventArgs e) |
37 | 38 | return; |
38 | 39 | } |
39 | 40 |
|
40 | | - var files = Directory.EnumerateFiles(viewModel.ProcessWorkingFolder, "*.csv"); |
41 | 41 | viewModel.InputFilePaths.Clear(); |
42 | 42 | viewModel.InputFileNames.Clear(); |
| 43 | + var files = Directory.EnumerateFiles(viewModel.ProcessWorkingFolder, "*.csv"); |
| 44 | + foreach (var file in files) |
| 45 | + { |
| 46 | + viewModel.InputFilePaths.Add(file); |
| 47 | + viewModel.InputFileNames.Add(Path.GetFileName(file)); |
| 48 | + } |
| 49 | + files = Directory.EnumerateFiles(viewModel.ProcessWorkingFolder, "*.bin"); // Hidden functionality that supports F32 bin files |
43 | 50 | foreach (var file in files) |
44 | 51 | { |
45 | 52 | viewModel.InputFilePaths.Add(file); |
46 | 53 | viewModel.InputFileNames.Add(Path.GetFileName(file)); |
47 | 54 | } |
| 55 | + |
48 | 56 | viewModel.SelectedInputFileIndex = 0; |
49 | 57 | } |
50 | 58 |
|
@@ -117,27 +125,67 @@ public async void btnRun_Click(object sender, RoutedEventArgs e) |
117 | 125 | viewModel.Status = "Status: Loading CSV..."; |
118 | 126 |
|
119 | 127 | using var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); |
120 | | - //using var reader = new StreamReader(stream); |
121 | | - //using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); |
122 | | - //var records = await csv.GetRecordsAsync<double>().ToListAsync(); |
123 | | - List<double> records = new(); |
| 128 | + List<double> records = []; |
124 | 129 | DateTimeOffset fileParseStart = DateTimeOffset.UtcNow; |
125 | | - await Task.Run(() => |
126 | | - { |
127 | | - using var streamReader = new StreamReader(stream); |
128 | | - var csvReader = new NReco.Csv.CsvReader(streamReader, ","); |
129 | | - if (viewModel.CsvHasHeader) |
130 | | - csvReader.Read(); |
131 | | - int columnIndex = viewModel.CsvColumnIndex; |
132 | | - while (csvReader.Read()) |
133 | | - { |
134 | | - var number = double.Parse(csvReader[columnIndex]); |
135 | | - if (number > 1e12) // Catches the overrange samples from DMM6500 |
136 | | - continue; |
137 | | - records.Add(number); |
138 | | - } |
139 | | - }); |
140 | 130 | DateTimeOffset fileParseFinish = DateTimeOffset.UtcNow; |
| 131 | + |
| 132 | + switch (Path.GetExtension(path)) |
| 133 | + { |
| 134 | + case ".csv": |
| 135 | + { |
| 136 | + //using var reader = new StreamReader(stream); |
| 137 | + //using var csv = new CsvReader(reader, CultureInfo.InvariantCulture); |
| 138 | + //var records = await csv.GetRecordsAsync<double>().ToListAsync(); |
| 139 | + |
| 140 | + fileParseStart = DateTimeOffset.UtcNow; |
| 141 | + await Task.Run(() => |
| 142 | + { |
| 143 | + using var streamReader = new StreamReader(stream); |
| 144 | + var csvReader = new NReco.Csv.CsvReader(streamReader, ","); |
| 145 | + if (viewModel.CsvHasHeader) |
| 146 | + csvReader.Read(); |
| 147 | + int columnIndex = viewModel.CsvColumnIndex; |
| 148 | + while (csvReader.Read()) |
| 149 | + { |
| 150 | + var number = double.Parse(csvReader[columnIndex]); |
| 151 | + if (number > 1e12) // Catches the overrange samples from DMM6500 |
| 152 | + continue; |
| 153 | + records.Add(number); |
| 154 | + } |
| 155 | + }); |
| 156 | + fileParseFinish = DateTimeOffset.UtcNow; |
| 157 | + break; |
| 158 | + } |
| 159 | + case ".bin": |
| 160 | + { |
| 161 | + fileParseStart = DateTimeOffset.UtcNow; |
| 162 | + await Task.Run(() => |
| 163 | + { |
| 164 | + const int ChunkSizeBytes = 8 * 1024 * 1024; // 8 MiB |
| 165 | + byte[] buffer = new byte[ChunkSizeBytes]; |
| 166 | + int bytesRead; |
| 167 | + |
| 168 | + while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) |
| 169 | + { |
| 170 | + // Only process full float32 values (4 bytes each) |
| 171 | + int validBytes = bytesRead - (bytesRead % 4); |
| 172 | + if (validBytes == 0) |
| 173 | + continue; |
| 174 | + |
| 175 | + ReadOnlySpan<byte> byteSpan = buffer.AsSpan(0, validBytes); |
| 176 | + ReadOnlySpan<float> floatSpan = MemoryMarshal.Cast<byte, float>(byteSpan); |
| 177 | + |
| 178 | + foreach (var f32 in floatSpan) |
| 179 | + { |
| 180 | + records.Add(f32); |
| 181 | + } |
| 182 | + } |
| 183 | + }); |
| 184 | + fileParseFinish = DateTimeOffset.UtcNow; |
| 185 | + break; |
| 186 | + } |
| 187 | + } |
| 188 | + |
141 | 189 | if (records.Count == 0) |
142 | 190 | { |
143 | 191 | viewModel.Status = "Error: No CSV records found"; |
|
0 commit comments