Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 как сохранить серию чисел из .txt файла? Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Пт Апр 06, 2012 8:44 pm Ответить с цитатой Вернуться к началу

Прошу знающих помочь.
Есть текстовый файл с данными вида:
Код:

SBER,26.02.2004,10:30:00,1.035, 1
SBER,26.02.2004,14:05:00,-0.619, 2
SBER,26.02.2004,16:10:00,-0.202, 1
SBER,26.02.2004,18:30:00,-0.479, 2
SBER,27.02.2004,10:45:00,0.612, 1
SBER,27.02.2004,12:05:00,0.490, 2
SBER,27.02.2004,13:20:00,0.511, 1
SBER,27.02.2004,16:20:00,0.389, 2
SBER,27.02.2004,18:10:00,0.123, 1
SBER,27.02.2004,18:40:00,0.051, 2

т.е. тикер, дата, время, индюк1, индюк2.
Хотел с помощью кода типа:
Код:

r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории

if(r)   
{
   fh1 = fopen( "qqq.txt", "r");
   if( fh1 )                                   
      {
         Buy1 = Sell1 =  0;
         pHist = dHist = timeHist = 0;
         time = TimeNum(); 

         while(!feof(fh1))
            {
            s = fgets(fh1);
            if(StrExtract(s, 0) == Name())
               {
               timeHist = StrToNum(StrExtract(s,2));
               bi = LastValue(BarIndex());
               pHist = StrToNum(StrExtract(s,3));
               
               dHist = StrExtract(s,4);
               
               for( i = 1; i < 14; i++ )
                  {
                  VarSet( "pHist"+i, Ref( pHist, -i ) );
                  }
   
                    
               }
         }
         printf("pHist " +pHist+ "\n");
         
         printf("pHist10 " +pHist10+ "\n");
         fclose( fh1 );
      }
}

сохранить серию значений pHist от 0 до -14, но при проверке все переменные pHist равны значению из последней строки, которая будет прочтена из файла истории. Подскажите где ошибка? Почему не сохраняются значения прочтенного файла?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Апр 06, 2012 9:34 pm Ответить с цитатой Вернуться к началу

Ну правильно.
Вот смотри.
Ты получил значение pHist = StrToNum(StrExtract(s,3)); из строки и потом это значение сохраняешь 14 раз в переменные pHist1, pHist2, pHist3...

for( i = 1; i < 14; i++ )
{
VarSet( "pHist"+i, Ref( pHist, -i ) );
}
Одно и то же значение сохраняешь 14 раз.

Надо как то так

Код:
r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории

 if(r)   
 {
    fh1 = fopen( "qqq.txt", "r");
    if( fh1 )                                   
    {
       Buy1 = Sell1 =  0;
       pHist = dHist = timeHist = 0;
       time = TimeNum(); 
       k = 0;
       while(!feof(fh1))
       {
          s = fgets(fh1);
          if(StrExtract(s, 0) == Name())
          {
              timeHist = StrToNum(StrExtract(s,2));
              bi = LastValue(BarIndex());
              pHist = StrToNum(StrExtract(s,3));
                 
              dHist = StrExtract(s,4);
               
              VarSet( "pHist"+k, Ref( pHist, -i ) );
              //тут можно вывести pHist k-тое
              k++;
           }
       }
       fclose( fh1 );   
    }
 }

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Сб Апр 07, 2012 12:33 pm Ответить с цитатой Вернуться к началу

Попробовал, как предложено. Получилось, что при запросе pHist последнее равно последнему значению из последней строки файла, а pHist10 к примеру, равно значению из 11 строки от начала файла. Это немного не то, что нужно, потому что в файл при работе кода будут добавляться строчки.
Надо как то сохранить в память группу из нескольких значений pHist, чтобы потом её сравнивать с такой же группой показаний реал-тайм индикатора.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 07, 2012 3:57 pm Ответить с цитатой Вернуться к началу

???
Ну
Получится, что первая строка запомниться в pHist0, вторая в pHist1, третья в pHist2 и т.д. до последней строки.
Что не так?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Сб Апр 07, 2012 6:02 pm Ответить с цитатой Вернуться к началу

Все верно, при таком коде сохранены будут все pHist из всех прочтенных строк, а надо что то похожее на работу функции ValueWhen(),
Код:

pHist = StrExtract(s,3);
pHist1=ValueWhen(pHist   !=Ref(pHist,-1),  Ref(pHist,-1),  -1);
pHist2=ValueWhen(pHist1 !=Ref(pHist1,-1),  Ref(pHist1,-1)  ,-1);

но такая конструкция в коде не работает
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 07, 2012 6:18 pm Ответить с цитатой Вернуться к началу

Надо создать длинный массив чтобы от первой даты, до следующей было одно значение, далее второе и т.п.?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Сб Апр 07, 2012 6:46 pm Ответить с цитатой Вернуться к началу

Да, наверно это можно назвать массивом. Нужно сформировать массив из значений полученных при чтении строк в файле. Но нужны не все значения, а только группа из 10 для примера, т.е. читаем 10 строк, получаем 10 значений, потом читаем 11 строку, все значения "сдвигаются" на одну позицию и бывшее первое становится вторым...., а бывшее 10 вообще выкидывается из памяти
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Апр 07, 2012 10:45 pm Ответить с цитатой Вернуться к началу

Ну это не сложно.
Код:

r = ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории

if(r)   
{
   fh1 = fopen( "qqq.txt", "r");
   if( fh1 )                                   
   {
      Buy1 = Sell1 =  0;
      pHist = dHist = timeHist = 0;
      time = TimeNum(); 
      k = 0;
      while(!feof(fh1))
      {
         s = fgets(fh1);
         if(StrExtract(s, 0) == Name())
         {
             timeHist = StrToNum(StrExtract(s,2));
             bi = LastValue(BarIndex());
             pHist = StrToNum(StrExtract(s,3));
                   
             dHist = StrExtract(s,4);
               
             for( i = 0; i < 14; i++ )
             {
               k[i] = k[i + 1];
               if(i == 13)
                 k[i] = pHist;
             }
          }
      }
      fclose( fh1 );   
   }
}

В результате получаем массив k[0] - k[13] значения которого равны последним 14 значениям из файла.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Вс Апр 08, 2012 10:19 am Ответить с цитатой Вернуться к началу

Не выходит Sad
Добавил в этот код строчки
Код:


printf("pHist " +pHist+ "\n");
printf("pHist2 " +k[13]+ "\n");

fclose( fh1 );


там где pHist последнее значение из последней строки файла, а там где pHist2 - просто 0.
Причем ноль при любом значении к[i] Sad
может я не верно пытаюсь вытащить значение из массива?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 08, 2012 11:39 am Ответить с цитатой Вернуться к началу

Ну конечно. Мы же выдергиваем из строки строку. А я её пытаюсь в массив запихать.... Надо её сначала в число превратить.
В общем вот такой код

Код:

r = 1; //ParamToggle("read file", "No|Yes", 1); // читать или нет файл истории
k = 0;

if(r)   
{
   fh1 = fopen( "C:\\qqq.txt", "r");
   if( fh1 )                                   
   {
      Buy1 = Sell1 =  0;
      pHist = dHist = timeHist = 0;
      time = TimeNum(); 

      while(!feof(fh1))
      {
         s = fgets(fh1);
         if(StrExtract(s, 0) == Name())
         {
             timeHist = StrToNum(StrExtract(s,2));
             bi = LastValue(BarIndex());
             pHist = StrToNum(StrExtract(s,3));
                   
             dHist = StrExtract(s,4);
             dHist = StrToNum(dHist);
 
             for( i = 0; i < 14; i++ )
             {
               k[i] = k[i + 1];
               if(i == 13)
                 k[i] = dHist;
             }
          }
      }
      fclose( fh1 );   
   }
}

printf("pHist " + NumToStr(k[10]) + "\n");
printf("pHist2 " + NumToStr(k[13]) + "\n");


И вот такой файл
Код:

SBER,26.02.2004,10:30:00,1.035, 1
SBER,26.02.2004,14:05:00,-0.619, 2
SBER,26.02.2004,16:10:00,-0.202, 3
SBER,26.02.2004,18:30:00,-0.479, 4
SBER,27.02.2004,10:45:00,0.612, 5
SBER,27.02.2004,12:05:00,0.490, 6
SBER,27.02.2004,13:20:00,0.511, 7
SBER,27.02.2004,16:20:00,0.389, 8
SBER,27.02.2004,18:10:00,0.123, 9
SBER,27.02.2004,18:40:00,0.051, 10
SBER,27.02.2004,18:40:00,0.051, 11
SBER,27.02.2004,18:40:00,0.051, 12
SBER,27.02.2004,18:40:00,0.051, 13
SBER,27.02.2004,18:40:00,0.051, 14
SBER,27.02.2004,18:40:00,0.051, 15
SBER,27.02.2004,18:40:00,0.051, 16
SBER,27.02.2004,18:40:00,0.051, 17
SBER,27.02.2004,18:40:00,0.051, 18


Замечательно работает.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Вс Апр 08, 2012 6:28 pm Ответить с цитатой Вернуться к началу

Огромнейшее спасибо!!!! добавил небольшое "спасибо" через qiwi Smile
Код работает, массив такой, как надо!!!
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Апр 08, 2012 7:59 pm Ответить с цитатой Вернуться к началу

И тебе спасибо!

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
sserk



Зарегистрирован: 15.01.2012
Сообщения: 23

СообщениеДобавлено: Пт Сен 28, 2012 9:43 pm Ответить с цитатой Вернуться к началу

Просьба помочь найти ошибку
Код:

//// блок чтения файла и формирования массива данных для поиска и сравнения

r=ParamToggle("read file", "No|Yes", 0); // читать или нет файл истории

ti = m = ym = 0; // переменные для времени, счетчика и поиска совпадений

if(r)   
{
   
   fh1 = fopen( "gazp06_12.txt", "r"); // открываем файл для чтения
   if( fh1 )                                   
   {
       timeHist = 0; // переменная для чтения из файла
             
      while(!feof(fh1))
      {
         s = fgets(fh1);
         if(StrExtract(s, 0) == Name())
         {
                timeHist = StrExtract(s,2); //читаем третью колонку
            timeHist = StrToNum(timeHist); // преобразуем из текста в цифру
           
              for( i = 0; i < 11; i++ )    //формируем массив из 11 значений  времени
            {
               
                  ti[i] = ti[i + 1]; // нулевое значение соотв. ti[10]               
            if(i == 10)
               
                 ti[i] = timeHist;
            }

            
            if(ti[9]==LastValue(timeB1)) // задаем условие для поиска совпадений, timeB1 задается индикатором в формате ччммсс (время без пробелов и разделителей) тайм 5 минут
               
               {m++; // определяем количество совпадений, для создания нужного количества элементов массива
                  for ( y = 0; y < m; y++) // пробуем создать массив из значений ti[10] попадающих под условие ti[9]= timeB1
                     {
                     ym[y] = ym[y+1];
                  if (y==m)
                     ym[y] = ti[10];  // а вот значений то в массиве и нет??????  где то ошибка
                     }

               }
          }

      
      }
   
      fclose( fh1 );   
   }
}


как создать массив для значений подходящих под условие в коде? и потом узнать среднее значение из всех полученных значений?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Сен 30, 2012 4:40 pm Ответить с цитатой Вернуться к началу

Может проще импортнуть этот файл в базу в виде еще одного тикера и работать с ним как с обычным тикером?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Сен 30, 2012 4:46 pm Ответить с цитатой Вернуться к началу

Если всетаки не хочешь импортировать файл в базу, то напиши словами что надо. Я из кода понять не смог....

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen