Как преобразовать csv: убрать столбцы, отсортировать

24.08.2017

Как преобразовать csv: убрать столбцы, отсортировать

Табличный редактор MS Excel хорошо справляется с редактированием CSV файлов. Вы можете сортировать и фильтровать данные, убирать ненужные колонки, добавлять нумерацию. Но что, если у вас нет табличного редактора? Редактирование csv файла превращается в ад. Вам нужно отслеживать разделители, чтобы понять к какой колонке относятся данные, сортировка же вообще становится практически не выполнимой задачей, особенно при работе с большими объемами данных.

Теперь подумаем, как можно выйти из такой ситуации. У нас есть FastReport .NET или FastReport Desktop. Мы можем использовать csv в качестве источника данных отчета. Внутри отчета совершить преобразования данных. Затем – экспортировать обратно в csv файл.

Давайте возьмем для примера небольшой csv файл со списком имен и адресов:

 

Также тут присутствует колонка Zip – почтовый индекс. Определимся с преобразованиями, которые мы хотим сделать:

  1. Убрать колонку Zip;
  2. Вынести из адреса название города в отдельное поле;
  3. Отсортировать записи по имени;
  4. Убрать из набора данных фамилию Гусев.

Создаем новый отчет. Добавляем новый источник данных CSV файл.

На странице отчета размещаем поля FIO и Address. Причем поле Address добавим дважды. Первое из добавленных полей Address отредактируем так: [Substring([Адреса.Address],0,6)]. Таким образом мы выделяем город Москва из адреса. Если бы названия городов были бы разными, нам потребовалась бы более сложная обработка. Для этого потребуется воспользоваться скриптом отчета. Для добавленного на бэнда текстового объекта нужно создать событие BeforePrint(). В скрипт добавляем использование библиотеки: using System.Text.RegularExpressions;

А вот так выглядит код обработчика события:

1
2
3
4
5
6
7
8
9
private void Text5_BeforePrint(object sender, EventArgs e)
 {
 Regex rgx = new Regex("([^,]|\n)+", RegexOptions.IgnoreCase);
 Match match = rgx.Match(Report.GetColumnValue("Адреса.Address").ToString());
 if (match.Success)
 {
 Text5.Text = match.Value.ToString();
 }
 }

 Как видите, мы воспользовались регулярным выражением, чтобы выбрать данные до запятой.

Но, вернемся ко второму полю Address, которое мы добавили. Так как мы отделили название города в отдельный столбец, тут должна остаться остальная часть адреса. Начиная с восьмой позиции в строке:

[Substring([Адреса.Address],8)]

Теперь отсортируем данные по фамилиям. Для этого делаем двойной клик по бэнду «Данные». Выбираем вкладку «Сортировка». Нам доступно три поля для сортировки. Задаем только первое значение – FIO:

 

Осталось отфильтровать данные по фамилии. Для этого, опять делаем двойной клик по бэнду «Данные». В появившемся окне выбираем вкладку «Фильтр» и вводим выражение Substring([Адреса.FIO],0,5)!="Гусев".

 

Запустим отчет в режиме предварительного просмотра:

 

Итак, мы убрали колонку ZIP, отсортировали список по фамилиям, разделили адрес на город и улицу, убрали строку для фамилии Гусев.

Теперь сделаем экспорт в файл csv. Для этого, в режиме предварительного просмотра нажимаем кнопку: .

И выбираем «CSV формат…». В диалоговом окне нажимаем Ок и выбираем место сохранения файла. В итоге получаем вот такой CSV файл:

 

Как видите, преобразовать документ средствами FastReport оказалось достаточно просто, по затратам времени сопоставимо с работой в редакторе Excel. Таким образом, FastReport становится альтернативным инструментом обработки CSV файлов.

1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.
28 октября 2024

Как настроить WSL 2 для работы с FastReport и FastCube

В этой статье попробуем вместе разобраться, как настроить WSL 2 для работы с компонентами FastReport и FastCube в Lazarus для Linux.