Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857

Опять о *.csv

29.10.2013, 23:00. Показов 8955. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Было прочитано много постов о о проблемах работы с .csv, но конкретных рекомендаций нет.
Сама задача, создать некий простенький редактор .csv. В нем пока планируется сделать редактирование значений и комбинированные фильтры.
Связи с этим у меня созрело 3 вопроса:
1.Можно ли отображать *.csv в DBGrid как таблицу ? Сейчас использую ADO и в DBGride отображается как столбец, наполненный построчно вместе с разделителями.
2. Каким способом можно редактировать *.csv файл ? Сейчас если менять в строке любое значение (не трогая разделители) то пишет что драйвер не поддерживает редактирование данного типа таблиц.
3. Если все так ужасно, может лучше перед открытием файла его конвертировать в exel или что нибудь другое, что можно будет в последствии легко редактировать, а после всех работ с файлом опять cохранять в .csv ?
Заранее спасибо, буду рад прочитать ваши мненния.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2013, 23:00
Ответы с готовыми решениями:

Опять MDI и опять нет активной формы
В общем, перед тем, как налетать на меня за эту тему, скажу, что я потратил более 6 часов на эксперименты и изучение всех возможных постов...

Экспорт данных после обработки в *.csv, используя Export-Csv
Данные находятся в файле sample.csv Команда Import-Csv -Encoding default -Delimiter ";" sample.Csv | ForEach-Object...

Обратиться к файлу в папке через CSV модуль и Параметры CSV
Доброго времени суток, я чувствую что решение проблемы простое, но никак не могу найти решение в общем есть папка с проектом на питоне и...

44
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
30.10.2013, 22:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от demon_7 Посмотреть сообщение
интересное предложение)
работать с .csv из 100+ строк в котором около 5 столбцов текстовые, заковычивая весь текст с пробелами, перед тем как открыть написанным приложением ) а потом провернуть все то же в обратную сторону, чтоб подгрузить файл)
Не так страшен черт, как его малюют. Каждую строку в файле csv можно обратить в список (стринг лист), в котором строки (0...4) - это ячейки соотв. строки таблицы. Все это в цикле; не так уж много усилий. В сам файл можно выводить построчно (опять же в цикле) методом StringGrid->Rows[index]->CommaText . Этот метод сам оборачивает "сложные" строки в кавычки. Заменять в строке запятую точкой с запятой - задачка для первоклассника; да может в самом методе есть средство выбора разделителя... - я на новых студиях не практиковался.
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.11.2013, 16:19  [ТС]
еще один вопросик. При сохранении StringList в файл, SaveToFile, идет изменение формата записи файла.
Допустим:
До сохранения набор данных выглядел так-
1;1;тест;;;текст;1;;
После сохранения выглядит так-
1;1;тест;" ";" ";текст;1;" ";
это как то можно исправить?
Заранее спасибо.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.11.2013, 16:30
Цитата Сообщение от nick42 Посмотреть сообщение
да может в самом методе есть средство выбора разделителя... - я на новых студиях не практиковался.
В новых студиях есть boost, есть System.RegularExpressions так что ...

Я уже не говорю что задача действительно детская, и ничего не стоит написать свою функцию сплитирования и объединения строк.
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.11.2013, 17:25  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Не так страшен черт, как его малюют. Каждую строку в файле csv можно обратить в список (стринг лист), в котором строки (0...4) - это ячейки соотв. строки таблицы. Все это в цикле; не так уж много усилий. В сам файл можно выводить построчно (опять же в цикле) методом StringGrid->Rows[index]->CommaText . Этот метод сам оборачивает "сложные" строки в кавычки. Заменять в строке запятую точкой с запятой - задачка для первоклассника; да может в самом методе есть средство выбора разделителя... - я на новых студиях не практиковался.
при использовании CommaText единственное что выходит это:
из- 1;1;;;1;текст из нескольких слов;1;2;текст
получается- 1;1;;;1;текст,из,нескольких,слов;1;2;тек ст
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
03.11.2013, 17:55
Если "текст из нескольких слов" в одной ячейке таблицы, то он и будет выглядеть, как я написал, то-есть в кавычках, а не каждое слово через запятую. Проверено.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
03.11.2013, 18:08
Цитата Сообщение от demon_7 Посмотреть сообщение
при использовании CommaText единственное что выходит
При использовании CommaText разделитель - запятая, а не точка с запятой... Для всех остальных разделителей нужен Delimiter + DelimitedText. А если еще задействовать StrictDelimiter, то даже кавычками текст оборачиваться не будет...
2
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.11.2013, 21:47  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
При использовании CommaText разделитель - запятая, а не точка с запятой... Для всех остальных разделителей нужен Delimiter + DelimitedText. А если еще задействовать StrictDelimiter, то даже кавычками текст оборачиваться не будет...
Действительно StrictDelimiter зарешал) огромное спасибо!
Правда вот сохраняет так же с пробелами, если между разделителями ничего не было, надеюсь это не повлияет при подгрузке файла в другое ПО.

Добавлено через 3 часа 10 минут
Ребят, столкнулся с очень не приятной проблемой.
Может кто знает как ее побороть...
Дело в том что те .csv файлы с которыми надо работать объемные- к примеру мой тестовый экземпляр на 15 с половиной тысяч строк.
Проблема заключается в сохранении...он то сохраняет...но около 8 минут..может как то можно сохранять только то что изменилось а не переписывать файл заново.
сохраняю кодом с примера Avazart
C++
1
2
3
4
5
6
7
8
std::auto_ptr<TStringList> SL(new TStringList); // Создаем переменную типа StringList
SaveDialog1->Execute();
for(int i=0;i<StringGrid1->RowCount;i++)
 {
  StringGrid1->Rows[i]->Delimiter=L';'; // Разделитель
  StringGrid1->Rows[i]->StrictDelimiter=1;
  SL->Add(StringGrid1->Rows[i]->DelimitedText); // Заполняем переменную значениями из таблицы
  SL->SaveToFile(SaveDialog1->FileName);   // Сохраняем в файл
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.11.2013, 21:51
Цитата Сообщение от demon_7 Посмотреть сообщение
Проблема заключается в сохранении...он то сохраняет...но около 8 минут..может как то можно сохранять только то что изменилось а не переписывать файл заново.
Нет... не с этим типом файла.

Попробуй сохранять через fstream

Добавлено через 1 минуту
Цитата Сообщение от demon_7 Посмотреть сообщение
к примеру мой тестовый экземпляр на 15 с половиной тысяч строк.
Интересно а как такое вообще отображается в StringGrid, нормально ?
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.11.2013, 21:55  [ТС]
ну это не самый большой файл...подгружал файл в 26к строк, открывает за секунд 5, что изначально удивило...ну чтож будем пытаться теперь сохранить по человечески.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.11.2013, 21:56
Попробуй сохранять через std::fstream или fprintf(), не используя TStringList
1
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
03.11.2013, 22:47  [ТС]
Сразу скажу что с потоками не работал поэтому не много путаюсь в коде.
вот нашел такой примерчик
C++
1
2
3
4
5
6
7
8
9
 FILE *fop=fopen(SaveDialog1->FileName.c_str(),"wt");
      if(fop)
      {
        if(StringGrid1->RowCount>0)
          fprintf(fop,StringGrid1->Rows[0]->CommaText.c_str());
        for(int i=1;i<StringGrid1->RowCount;i++)
          fprintf(fop,"\n%s",StringGrid1->Rows[i]->CommaText.c_str());
        fclose(fop);
      }
он сохраняет мой файл в 15к строк за секунды 3, но проблема в CommaText который разделители меняет на ','..
Извиняюсь что возвращаюсь к старому, но как тут прописать разделитель?

Добавлено через 11 минут
Вроде разобрался...
сделал так-
C++
1
2
3
4
5
6
7
8
9
10
SaveDialog1->Execute();
  FILE *fop=fopen(SaveDialog1->FileName.c_str(),"wt");
      if(fop)
      {
        if(StringGrid1->RowCount>0)
          fprintf(fop,StringGrid1->Rows[0]->DelimitedText.c_str());
        for(int i=1;i<StringGrid1->RowCount;i++)
          fprintf(fop,"\n%s",StringGrid1->Rows[i]->DelimitedText.c_str());
        fclose(fop);
      }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
03.11.2013, 23:13
Цитата Сообщение от demon_7 Посмотреть сообщение
он то сохраняет...но около 8 минут..
Что? 15 тысяч строк - 8 минут? Сказка какая-то... Может, это потому что у тебя в коде из 27-го сообщения происходит 15 тысяч перезаписей файла (там нет закрывающей фигурной скобки перед вызовом SaveToFile)? Вообще файл из полумиллиона строк чуть больше секунды сохраняется через TStringList...

Где-то в другом месте у тебя тормоза...
1
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
04.11.2013, 16:21  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Что? 15 тысяч строк - 8 минут? Сказка какая-то... Может, это потому что у тебя в коде из 27-го сообщения происходит 15 тысяч перезаписей файла (там нет закрывающей фигурной скобки перед вызовом SaveToFile)? Вообще файл из полумиллиона строк чуть больше секунды сохраняется через TStringList...

Где-то в другом месте у тебя тормоза...
И Вы выигрываете АВТОМОБИЛЬ!
Действительно Ваша наблюдательность и опыт опять победили доводы нуба ), SaveToFile был в for'е что и приводило к постоянным перезаписям файла)
ну теперь я знаю 2 способа сохранения...век нуби, век учись...Всем огромное спасибо за помощь, правда я подозреваю это мои отнюдь не последние "тупые" вопросы...вы уж извините заранее..

Добавлено через 16 часов 51 минуту
Дошел до создания комбинированного фильтра.Возникли некоторые проблемы...большинство примеров сортируют StringGrid по возрастанию\убыванию и Алфавиту.
Мне же надо сортировать по заданным параметрам.
Например:
На форме есть несколько ComboBox (равные количествам столбцов). В них содержатся значения столбцов в единственном экземпляре (то есть повторяющиеся значения заносятся в combobox 1 позицией).
Сортировка должна происходить из значений выбранных в combobox.
То есть некая комбинированная сортировка строк по нескольким значениям с разных столбцов. Надеюсь написал доступно.
Может у кого то есть мысли? Заранее спасибо.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
04.11.2013, 16:46
Цитата Сообщение от demon_7 Посмотреть сообщение
большинство примеров сортируют StringGrid по возрастанию\убыванию и Алфавиту
Какая разница? В большинстве случаев сортировка Грида делается через CustomSort, то есть, сортируются сами данные, и потом, уже отсортированные, заново отображаются в гриде (о есть, тебе достаточно просто правильно реализовать функцию TStringListSortCompare, и данные отсортируются в любом порядке и по любому условию). Можешь привести небольшой пример, что именно содержит грид, что выбрано в комбобоксах, и как в зависимости от этого содержимое грида должно быть переупорядочено?
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
04.11.2013, 17:38  [ТС]
Собственно таблица.
http://rghost.ru/private/49928... ea543.view
Сортировка должна идти по нескольким полям(пока фиксировано назвать по каким именно не могу) но точно по:
Inv (там только значения будут 0 и 1)
GroupName (имя протокола)
OIKType (Тип параметра)
Category (категория)
BlockName (опер зона)
Примерно столько же будет ComboBox для каждого столбца, в них будут содержаться данные из столбцов в единственном числе.
То есть будет Набор имен протоколов, набор имен типов параметра, набор имен категорий и т.д.
ComboBox еще не создавал...пытаюсь разобраться с сортировкой..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
04.11.2013, 17:44
И что? Вот выбрал я в комбобоксе INV значение 0, а в Category - значение "Внешнее ТИ". Что должно произойти? сначала сортировать по INV, а если INV-ы равны - то по Category? Я ж говорю, это обычная CustomSort. Сейчас покажу пример...
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
04.11.2013, 17:48  [ТС]
Саму сортировку примерно вижу так..
Сверху строки, в которых есть те значения, которые выбраны в combobox.думаю основная работа будет происходить именно с ними, поэтому как будет ниже пока не важно.
При выборе первого combobox происходит сортировка по выбранному параметру, (если выбираются следующие, то уже сортировка ведется относительно выбранного параметра)
Допустим выбрали Category - первичное ТИ.
Вверх ушли все с строки в которых в столбце Category есть значение "первичное ТИ"
Дальше выбрали OIKType "U", теперь сверху все строки у которых Category "первичное ТИ"; OIKType "U". Ну и так далее.
Если выбрано значение в ComboBox которое в своей сумме не дает результата.
Например Category "первичное ТИ"; OIKType "U"; Inv "1" (Строки с данным набором имен нет в таблице)...То сообщенько или просто ничего не делать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
04.11.2013, 17:57
Так это не сортировка у тебя, а фильтрация получается... Хотя нет... Опять же, вопрос остается в силе: если в таблице есть содержимое нескольких комбобоксов, то как они должны сортироваться МЕЖДУ СОБОЙ?
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
04.11.2013, 18:04  [ТС]
как бы так правильнее написать.
Следующая сортировка, сортирует данные из предыдущих сортировок.
Думаю так правильнее будет.
Пример:
Выбрали Category "Первичное ТИ", при выборе OIK Type "U" уже сортирует(ищет) только строки в которых есть Category "Первичное ТИ", дальше выбрали Inv "0", сортировка(поиск) идет только в строках с значениями Category "Первичное ТИ", OIK Type "U" ну и так далее.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33479 / 21577 / 8250
Регистрация: 22.10.2011
Сообщений: 37,040
Записей в блоге: 12
06.11.2013, 18:28
В общем, дело темное с твоими объяснениями...

Думал я думал - решил предложить тебе способ, который будет работать гораздо быстрее, чем со StringGrid-ом. Предлагаю убрать СтрингГрид из проекта, и заменить его на DrawGrid. Объясняю, чем это лучше: StringGrid - он хранит в себе данные, которые отображает. Поэтому в любом случае для переупорядочивания этих данных приходится все содержимое грида сливать в какой-то временный буфер, переупорядочивать его, и уже потом возвращать новое содержимое. Это долго. Тем дольше, чем больше строк/столбцов в гриде.

В свою очередь, TDrawGrid никаких данных не хранит, только отображает. Поэтому можно один раз при старте приложения записать данные в любую структуру, с которой будет удобно работать (я в качестве этой структуры выбрал стандартный std::vector, ибо его сортировка делается в одну строку, когда нужно, тем же std::sort-ом), и потом уже оперировать с данными, без их постоянного копирования с места на место, при необходимости просто перерисовывая DrawGrid, и он уже будет отображать обновленные данные. Эдакий "виртуальный грид" (а чего: ListBox, значит, виртуальным делать можно, а StringGrid почему-то нельзя?)...

В аттаче - реализация (я особо заморачиваться не стал, сделал для 5 строк, но повторяю: это неважно, можно было бы и на десятке тысяч проверить, на скорости обработки это бы не особо сказалось). Да, по поводу сортировки: я сделал так, что если в комбобоксе что-то выбрано (отличное от <...>), то строки, которые содержат все выбранные значения, поднимаются наверх, остальные остаются на местах...
Вложения
Тип файла: zip sort_drawgrid.zip (75.4 Кб, 39 просмотров)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2013, 18:28

Запись в CSV-файл из массива. Не является форматом csv!
В общем искал работу... Дали тестовое написать парсер для сайта с выводом информации в csv-файл. Всё написал, сбросил, пришёл ответ что у...

Конвертировать CSV ANSI в CSV UTF-8 или шо делать
Привет, есть проблема, импортирую данные из CSV в mssql через Винформс, все хорошо инсертится если CSV файл открыть блокнотом и изменить...

Разбиение CSV файла на много csv файлов по разделителю
Здравствуйте, есть файл в который нужно разделить, но не ровно по 30 строк например, а по 25, 23, 27. Как это можно сделать?

Опять БАН опять Яндекс...
Вообщем ситуация такая, был сайт, написаный на дримвевере, отлично индексируемый и имеющий 400-500 переходв с поисковика яндекса. Стали...

Gameorplay Опять и опять
Здравствуйте, уважаемые знатоки. Помогите пожалуйста решить проблему с автоматическим запуском Firefox при старте Windows и открытия сайта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru