Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько csv файлов в несколько StrigGrid одним к 
:(
    Опции темы
Alkor135
Дата 5.4.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Я загружаю csv файл в StringGrid следующей процедурой (по нажатию кнопки выбираю файл и гружу в StringGrid):
Код

procedure TfMain.bZAUDCADClick(Sender: TObject);
var
  st: string;
  f: TextFile;
  i: integer;
  od1: TOpenDialog;
begin
  od1:=TOpenDialog.Create(self);
  if od1.Execute then begin
       i:=0;
       AssignFile(f, od1.FileName);
       Reset(f);
       while not Eof(f) do begin
         ReadLn(f, St);
         st:=StringReplace(st,',',#13#10,[rfReplaceAll]);
         tAUDCAD.Rows[i].SetText(pchar(st));
         inc(i);
       end;
  end;
  od1.free;
end;

Но у меня 27 файлов и 27 StringGrid. Сейчас у меня 27 кнопок загрузки. Как упростить, чтобы загрузить 27 файлов кликнув по одной кнопке. Выбирать файлы для загрузки не надо, лучше каждый файл прописать в коде (естественно сохранив соответствие каждому файлу свой StringGrid).
Заранее спасибо!
PM MAIL   Вверх
Bose
Дата 5.4.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Добавь процедуру:
Код

procedure TfMain.MyLoadGrid(aGrid: TНазваниеКлассаГрида; aFilename: string);
var
  st: string;
  f: TextFile;
  i: integer;
begin
   i:=0;
   AssignFile(f, aFileName);
   Reset(f);
   while not Eof(f) do begin
     ReadLn(f, St);
     st:=StringReplace(st,',',#13#10,[rfReplaceAll]);
     aGrid.Rows[i].SetText(pchar(st));
     inc(i);
   end;
   // a закрывать открытый файл кто будет? Пушкин?
end;


Вызывай её так:
Код

procedure TfMain.bZAUDCADClick(Sender: TObject);
var
  od1: TOpenDialog;
begin
  od1:=TOpenDialog.Create(self);
  try
      if od1.Execute then 
        MyLoadGrid(tAUDCAD, od1.FileName);
  finally
    od1.free;
  end;
end;


PM MAIL WWW Skype   Вверх
Alkor135
Дата 6.4.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Bose, спасибо. 
Что-то я не так делаю, компилятор выдает ошибки:
[Error] Main.pas[211]: Undeclared identifier: 'MyLoadGrid'
[Error] Main.pas[218]: Undeclared identifier: 'aFileName'
[Error] Main.pas(223): Undeclared identifier: 'aGrid'
[Error] Main.pas[223]: Missing operator or semicolon
[Error] Main.pas[236]: Undeclared identifier: 'MyLoadGrid'
[Fatal Error] Pairs_Week.dpr[5]: Could not compile used unit 'Main.pas'

Выяснил еще одну жуткую вещь. StringGrid в моем случае использовать нельзя. У меня в каждом csv файле 128 000 строк и 7 полей, а в будущем собираюсь использовать csv файлы с 1 000 000 строк. Так вот, после загрузки около десятка файлов Delphi выдает сообщение о проблемах с памятью. Видимо нужно решать эту задачу не средствами StringGrid, всеравно мне отображение и изменение загруженных файлов не нужно. Я создам новую ветку с вопросом о средствах решения поставленной задачи.
PM MAIL   Вверх
Данкинг
Дата 6.4.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Alkor135 @  6.4.2009,  10:00 Найти цитируемый пост)
[Error] Main.pas[211]: Undeclared identifier: 'MyLoadGrid'

Ты эту процедуру описал в Form1 ? Видимо, нет! smile 

Цитата(Alkor135 @  6.4.2009,  10:00 Найти цитируемый пост)
[Error] Main.pas[223]: Missing operator or semicolon

Ищи, где точку с запятой забыл.

Цитата(Alkor135 @  6.4.2009,  10:00 Найти цитируемый пост)
[Fatal Error] Pairs_Week.dpr[5]: Could not compile used unit 'Main.pas'

А вот это действительно ###. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Alkor135
Дата 7.4.2009, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Спасибо конечно.
Сейчас для меня более актуально, как загнать 27 csv файлов в БД, чтобы потом с ними работать.
PM MAIL   Вверх
Данкинг
Дата 7.4.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Alkor135 @  7.4.2009,  02:52 Найти цитируемый пост)
Сейчас для меня более актуально, как загнать 27 csv файлов в БД, чтобы потом с ними работать. 

Не вижу соответствующей темы с твоей стороны...


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Alkor135
Дата 7.4.2009, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Цитата(Данкинг @  7.4.2009,  01:56 Найти цитируемый пост)
Не вижу соответствующей темы с твоей стороны...

Тема такая:
Есть идея сделать программу которая протестирует на исторических данных одну мультивалютную стратегию для FOREX.
Есть исторические данные одноминутных баров 27 валютных пар в csv файлах. Вот их и нужно загрузить в БД. Далее берутся данные из БД и расчитываются 14 самых волатильных и самых коррелированых валют, из них формируется портфель. Создается табличка (думаю подойдет табличка StringGrid) в которую записываются текущие данные из БД. По нажатии на кнопочку происходит скачек на определенное (задается пользователем) количество баров вперед. 
Вобщем изменять данные в БД не нужно, нужно только считывать и обрабатывать (производить вычисления).

Сейчас изучаю как с помощью BDE Administrator создать БД, а с помощью Database Desktop создать таблицы в которые буду грузить данные из csv файлов. Далее надо будет написать процедуру загрузки данных из csv в БД.

Если кто может подсказать как это сделать, буду очень признателен.


PM MAIL   Вверх
Bose
Дата 7.4.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Alkor135, может быть, а может и не быть, тут можно воспользоваться компонентом CsvDataset из библиотеки JVCL. Идея компонента в том, что он реализует наследуется от класса TDataset, но работает не с SQL базой данных, а с csv файлами. Соответственно, с ним можно работать как с любым Dataset-ом, и использовать для отображения данных не StringGrid, a любой DbGrid. Хотя, насколько я понял, отображение исторических данных в твоём случае неактуально.


PM MAIL WWW Skype   Вверх
Alkor135
Дата 7.4.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Bose,  это вероятно для меня пока слишком сложно. Я еще понятия не имею о библиотеках, и где их взять, и как подключать.

Я тут написал парочку процедур, думал, что удастся загнать данные в БД, но компилятор ругается.
Вот код, может подскажете где я ошибся. 
Код

{ Загрузка данныъх из csv файла в StringGrid }
procedure TForm1.Button1Click(Sender: TObject);
var
  st: string;
  f: TextFile;
  i: integer;
  od1: TOpenDialog;
begin
  od1:=TOpenDialog.Create(self);
  if od1.Execute then begin
       i:=0;
       AssignFile(f, od1.FileName); // Устанавливаем связь
       Reset(f); // Сбрасываем файл f на чтение с начала
       while not Eof(f) do begin
         ReadLn(f, St); // Читаем строку в строковую переменную s из файла f
         st:=StringReplace(st,',',#13#10,[rfReplaceAll]); // Заменяем запятую на конец строки с возвратом каретки во всех вхождения найденных в строке
         tAUDCAD.Rows[i].SetText(pchar(st));
         inc(i);
       end;
  end;
  od1.free;
  CloseFile(f); // Закрываю файл
end;

{ Загрузка данныз из StringGrid в БД через SQL запрос }
procedure TForm1.Button2Click(Sender: TObject);
var
  J : Integer;
begin
  ShortDateFormat := 'yyyy mm dd';
  DecimalSeparator := '.';
  with tAUDCAD do
    for J:=0 to RowCount - 1 do //Перебираем строки
      Query1.active:=false;
      Query1.sql.text:='Insert into AUDCAD (Date, Time, Open, High, Low, Close, Volume)
      values (Cells[0,J], Cells[1,J], Cells[2,J], Cells[3,J], Cells[4,J], Cells[5,J], Cells[6,J])';
      Query1.active:=true;
end;


PM MAIL   Вверх
Bose
Дата 7.4.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Цитата(Alkor135 @  7.4.2009,  14:52 Найти цитируемый пост)
Query1.sql.text:='Insert into AUDCAD (Date, Time, Open, High, Low, Close, Volume)
      values (Cells[0,J], Cells[1,J], Cells[2,J], Cells[3,J], Cells[4,J], Cells[5,J], Cells[6,J])';

Во-первых, так:
Query1.sql.text:='Insert into AUDCAD (Date, Time, Open, High, Low, Close, Volume)
      values ('+Cells[0,J]+', '+Cells[1,J]+', '+Cells[2,J]+', '+Cells[3,J]+', '+Cells[4,J]+', '+Cells[5,J]+', '+Cells[6,J]+')';

Цитата(Alkor135 @  7.4.2009,  14:52 Найти цитируемый пост)
Я тут написал парочку процедур, думал, что удастся загнать данные в БД, но компилятор ругается.

Во-вторых, как ругается?
PM MAIL WWW Skype   Вверх
Alkor135
Дата 7.4.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Bose, спасибо переделал.
Код

{ Загрузка данныз из StringGrid в БД через SQL запрос }
procedure TForm1.Button2Click(Sender: TObject);
var
  J : Integer;
begin
  ShortDateFormat := 'yyyy mm dd';
  DecimalSeparator := '.';
  with tAUDCAD do
    for J:=0 to RowCount - 1 do //Перебираем строки
      Query1.active:=false;
      Query1.sql.text:='Insert into AUDCAD (_Date, _Time, _Open, _High, _Low, _Close, _Volume) values ('+Cells[0,J]+', '+Cells[1,J]+', '+Cells[2,J]+', '+Cells[3,J]+', '+Cells[4,J]+', '+Cells[5,J]+', '+Cells[6,J]+')';
      Query1.active:=true;
end;

Компилятор теперь ругается на несовместимые типы:
[Error] Main.pas(66): Undeclared identifier: 'Cells'
[Error] Main.pas(66): Incompatible types: 'String' and Integer
[Error] Main.pas(66): Incompatible types: 'String' and Integer
[Error] Main.pas(66): Incompatible types: 'String' and Integer
[Error] Main.pas(66): Incompatible types: 'String' and Integer
[Error] Main.pas(66): Incompatible types: 'String' and Integer
[Error] Main.pasl6S]: Incompatible types
[Fatal Error] BD_3.dpr(5): Could not compile used unit 'Main.pas'

Правда не понял почему. Ведь в StringGrid строковые данные в созданной таблице вроде тоже
user posted image
PM MAIL   Вверх
Bose
Дата 8.4.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



begin .. end надо ещё после with
и после for do
Код

procedure TForm1.Button2Click(Sender: TObject);
var
  J : Integer;
begin
  ShortDateFormat := 'yyyy mm dd';
  DecimalSeparator := '.';
  with tAUDCAD do
  begin
    for J:=0 to RowCount - 1 do //Перебираем строки
    begin
      Query1.active:=false;
      Query1.sql.text:='Insert into AUDCAD (_Date, _Time, _Open, _High, _Low, _Close, _Volume) values ('
       +Cells[0,J]+', '+Cells[1,J]+', '+Cells[2,J]+', '+Cells[3,J]+', '+Cells[4,J]+', '+Cells[5,J]+', '+Cells[6,J]+')';
      Query1.active:=true;
    end;
  end;
end;


Это сообщение отредактировал(а) Bose - 8.4.2009, 02:27
PM MAIL WWW Skype   Вверх
Alkor135
Дата 8.4.2009, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Цитата(Bose @  8.4.2009,  02:26 Найти цитируемый пост)
begin .. end надо ещё после withи после for do

Спасибо, компилятор ругаться перестал.
Теперь появились ошибки при попытке загрузить данные из StringGrid в БД.
user posted image
user posted image

Что-то о неправильном использовании ключевого слова.
Что это значит?
PM MAIL   Вверх
Bose
Дата 8.4.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



нельзя поле называть _date
PM MAIL WWW Skype   Вверх
Alkor135
Дата 8.4.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 5.4.2009

Репутация: нет
Всего: нет



Цитата(Bose @  8.4.2009,  11:51 Найти цитируемый пост)
нельзя поле называть _date

Спасибо! Поменял название полей в таблице и в процедуре:
Код

{ Загрузка данных из StringGrid в БД через SQL запрос }
procedure TForm1.Button2Click(Sender: TObject);
var
  J : Integer;
begin
  ShortDateFormat := 'yyyy mm dd';
  DecimalSeparator := '.';
  with tAUDCAD do
  begin
    for J:=0 to RowCount - 1 do //Перебираем строки
    begin
      Query1.active:=false;
      Query1.sql.text:='Insert into AUDCAD (Da, Ti, Op, Hi, Lo, Cl, Vol) values ('
       +Cells[0,J]+', '+Cells[1,J]+', '+Cells[2,J]+', '+Cells[3,J]+', '+Cells[4,J]+', '+Cells[5,J]+', '+Cells[6,J]+')';
      Query1.active:=true;
    end;
  end;
end;

Ошибка с "Token:_Date" исчезла. 
Зато появилась ошибка:
Project BD_3.exe raised exception class EDBEngineError with message 'Invalid use of keyword.
Token:.21,
Line Number: Г. Process stopped. Use Step or Run to continue.
Это он ругается на дату в первом поле 2008.11.21. А ведь я задавал строковый формат в Database Desktop для 1-го поля (Alpha).
Отчего такая ошибка и как с ней справиться?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1056 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.