sortByDate sorts column by date format with optimized date parsing
(colIndex int, rev bool)
| 337 | |
| 338 | // sortByDate sorts column by date format with optimized date parsing |
| 339 | func (b *Buffer) sortByDate(colIndex int, rev bool) { |
| 340 | hasHeader := I2B(b.rowFreeze) |
| 341 | dataRows := b.cont |
| 342 | if hasHeader { |
| 343 | dataRows = b.cont[1:] |
| 344 | } |
| 345 | |
| 346 | // Create index-value pairs to sort |
| 347 | type dateRow struct { |
| 348 | row []string |
| 349 | date int64 |
| 350 | } |
| 351 | |
| 352 | pairs := make([]dateRow, len(dataRows)) |
| 353 | for i := range dataRows { |
| 354 | pairs[i] = dateRow{ |
| 355 | row: dataRows[i], |
| 356 | date: parseDateValueFast(dataRows[i][colIndex]), |
| 357 | } |
| 358 | } |
| 359 | |
| 360 | // Sort the pairs |
| 361 | if rev { |
| 362 | sort.SliceStable(pairs, func(i, j int) bool { |
| 363 | return pairs[i].date > pairs[j].date |
| 364 | }) |
| 365 | } else { |
| 366 | sort.SliceStable(pairs, func(i, j int) bool { |
| 367 | return pairs[i].date < pairs[j].date |
| 368 | }) |
| 369 | } |
| 370 | |
| 371 | // Copy back sorted rows |
| 372 | for i := range pairs { |
| 373 | dataRows[i] = pairs[i].row |
| 374 | } |
| 375 | } |
| 376 | |
| 377 | // parseNumericValueFast quickly parses a string to float64 |
| 378 | // Handles commas, underscores, and returns 0 for invalid values |