Я разбираю файл Excel, который организован таким образом:
header1
header2
data
data
[...]
data
one blank line
data
data
[...]
data
one blank line
Итак, у нас есть заголовок, который нужно пропустить, некоторые данные переменной длины, пустая строка, некоторые данные переменной длины и пустая строка, обозначающая конец интересующей зоны.
Два блока данных анализируются идентичным образом, и они должны оказаться в одном списке, но важно то, что я знаю индекс пустой строки посередине (это список, который обрабатывается от середины, вверх или вниз).
Есть два предостережения:
- верхняя и нижняя части не имеют одинаковой длины.
- Одна из сторон может быть пустой.
Прямо сейчас у меня есть не очень чистая реализация, поскольку она дублирует код :
let gridRowsUp =
gridExcel
|> List.skip 2
|> List.takeWhile (fun rowData -> rowData |> Seq.exists(fun x -> not (String.IsNullOrEmpty(x))))
|> List.mapi (fun index rowData -> parseGridLayer (index + 2) rowData)
// get the index of the middle row
let middleRow = 2 + gridRowsUp.Length
// get the bottom part of the grid
let gridRowsDown =
gridExcel
|> List.skip (1 + middleRow)
|> List.takeWhile (fun rowData -> rowData |> Seq.exists(fun x -> not (String.IsNullOrEmpty(x))))
|> List.mapi (fun index rowData -> parseGridLayer (index + 1 + middleRow) rowData)
let gridData = gridRowsUp @ gridRowsDown
В идеале, я хотел бы обрабатывать строки данных за один go, но пропустить и записать местоположение пустой строки посередине.
Я подумал о найти первую пустую строку и перестроить список с извлеките его (так как теперь я знаю индекс), но он запутан, так как мне нужно найти первый, затем найти второй, чтобы знать, где остановиться (внизу может быть много неиспользуемых дополнительных строк), затем снова построить один список . А удаление элемента в середине списка в F # не идеально.
Как я могу сделать это более упорядоченным?