Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857

Опять о *.csv

29.10.2013, 23:00. Показов 8965. Ответов 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,041
Записей в блоге: 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,041
Записей в блоге: 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,041
Записей в блоге: 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,041
Записей в блоге: 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,041
Записей в блоге: 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,041
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru