Как из списка сделать таблицу (нестандартная ситуация)

Egor1129

Client
Регистрация
02.01.2020
Сообщения
60
Благодарностей
9
Баллы
8
Имеем списочный файл txt, в котором спрятана таблица. Формат данных такой:

1 строка: Столбец A (ID записи)
2 строка: Столбец B (Дата создания)
3 строка: Столбец С (Номер телефона)
4 строка: Столбец D (ФИО ответственного)
5 строка: столбец Е (Статус)
6 строка: столбец F (Дата изменения)
------
и так далее сотня тысяч записей (соответственно около 600 тысяч строчек).

Если бы формат сохранялся на протяжении всего файла, никаких проблем: берешь построчно, и через переменную вносишь в таблицу.
Проблема в том, что в некоторых записях отсутствует телефон. В этом случае 3-я строка отсутствует, и блок данных представляет из себя 5 строчек. А если учесть, что блоки данных (строчки) никакими разделителями не отделены, то из за этого все "плывет". Ошибок базы не слишком много, пара процентов, но это приводит к тому, что перенос в таблицу сбивается. Соответственно при моем способе переноса в случае с пятистрочным блоком фио попадает в третью строчку, статус в четвертую и так далее до конца таблицы.

Подскажите плз как можно решить этот вопрос.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
Набросал с телефона, возможны опечатки, пробуйте. Прокомментировал код, может, кто поправит, если что;-)
C#:
IZennoList list = project.Lists["list"];//исходный список
IZennoTable table = project.Tables["table"];//таблица проекта, которую буду заполнять
List<string> temp = new List<string>();//временный список, то есть каждый блок с данными
while(list.Count() > 0){//пока список содержит строки
    string item = list.GetItem(0, true);//беру построчно с удалением
    temp.Add(item);//заполняю блок
    if(temp.Count() >= 5){//исходя из условия, каждая 5-ая или 6-ая строка должна содержать дату
        if(DateTime.TryParse(item, out DateTime dt)){//если попалась дата, добавлю блок в строку таблицы
            if(temp.Count() == 5){//если 5 строк, значит телефона нет
                temp.Insert("", 2);//и добавлю пустую ячейку виесто телефона
            }
            table.AddRow(temp);//запись строки в таблицу
            temp.Clear();//очищаю временный список
        }
     }
}
 
  • Спасибо
Реакции: Sho и Ilshakin

Egor1129

Client
Регистрация
02.01.2020
Сообщения
60
Благодарностей
9
Баллы
8
Спасибо огромное за ответ. Я C# не знаю, поэтому уже по другому реализовал.

По факту не нужно идентификатор всей шести(пяти)строчной записи. Получается есть только 2 варианта:

1) Если в 3-й строчке идет запись содержащая любую цифру, значит все нормально.
2) Если в 3-й строчке идет запись, не содержащая цифр (ведь ФИО их не содержит), значит нужно ставить пустую ячейку.

Вот эту логику и зашил при переносе с помощью регулярки поиска любой цифры .*(0|1|2|3|4|5|6|7|8|9).*
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 379
Благодарностей
3 303
Баллы
113
Обычно те, кто предоставляет информацию реализуют и разделители для неё, иначе вам придётся парсить каждую строку.
Достаточно пустоты между разделителями.
 

Egor1129

Client
Регистрация
02.01.2020
Сообщения
60
Благодарностей
9
Баллы
8
Обычно те, кто предоставляет информацию реализуют и разделители для неё, иначе вам придётся парсить каждую строку.
Достаточно пустоты между разделителями.
Я не знаю как обычно, но информацию я парсил собственноручно )))))))))))))))))))))))))) Если бы я заказывал эту работу, никогда бы не принял в таком виде результат.

А я вот невеликий мастер, пока только учусь. Там была целая куча мусора припарсинге, который я убил функцией Trim, поэтому пришлось огород городить. Но я уже решил эту проблему, всем спасибо! Не супер-шустрая получилась реализация, но для моих целей вполне подходит.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)