Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как вытянуть данные из текстового файла?  (Прочитано 10782 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Максим
Гость
« : 28-04-2009 23:35 » 

имеется файл с набором цифр. разделённых иногда пробелами, а иногда двоеточиями нужно вытянуть данные и поместить в массив. Как это сделать поизящнее не раздувая код. я думал вначале через сравнение поудалять лишние пробелы а то что не похоже на пробел заносить в массив через StrToInt. ниже пример части файла
Цитата
  00:30  00119   00125        00130   00131        00133   00139
может можно это как-то проще сделать?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 29-04-2009 01:22 » 

А это обязательно в дельфях надо сделать? В С++ можно так сделать:

Код:
	string stData = "00:30  00119   00125        00130   00131        00133   00139";

        // заменим все : на пробелы
replace_if(stData.begin(), stData.end(), bind2nd(equal_to<char>(),':'), ' ');

        // лишние пробелы будут проигнорированы автоматически
stringstream  sstr(stData);
int n = 0;
while (sstr >> n)
{
cout << n << endl;
}

результат для твоего примера:

0
30
119
125
130
131
133
139
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #2 : 29-04-2009 03:50 » 

Код:
var
    s:string = '00:30  00119   00125        00130   00131        00133   00139';
   massiv: array [1..100] of Integer;
    k, k1, i: Integer;

  i := 1;
  While True do
  begin
    s := Trim(s);
    k := Pos(':', s);
    k1 := Pos(' ', s);
    If (k = 0) and (k1 = 0) then
    break;
    If (k > k1) and (k1 <> 0) or (k = 0) then
    k := k1;
    massiv[i] := StrToIntDef(Copy(s, 1, k), -1);
    Delete(s, 1, k);
    inc(i);
  end;
  massiv[i] := StrToIntDef(s, -1);
« Последнее редактирование: 29-04-2009 03:55 от zubr » Записан
Максим
Гость
« Ответ #3 : 02-05-2009 19:50 » 

что-то я не пойму что получается в massiv? по логике нарезка из строки должна получиться. но я не могу из массива ничего выловить, через IntToStr получаются нули!!!
если я не прав - поправте меня:   первые символы в примере- это время (9:30), чтобы его распознать нужно добавить if и обработать через StrToTime ? Заранее спасибо
Записан
Максим
Гость
« Ответ #4 : 02-05-2009 20:06 » 

извините я только учусь Краснею, ошибки неизбежны... StrToIntDef  по дефолту загоняет -1 в массив, а почему преобразование не удачное?  может дело в кодировке файла? (создан в эмуляции DOS)
Записан
zubr
Гость
« Ответ #5 : 02-05-2009 21:20 » 

Извини, ошибся, вместо строки
Код:
massiv[i] := StrToIntDef(Copy(s, 1, k), -1);
сделай
Код:
massiv[i] := StrToIntDef(Copy(s, 1, k - 1), -1);
И смотри в отладке, что передается в массив, тогда будет понятно, где косяк.
З.Ы. Код писал от руки, не проверяя, так что не обессудь.
Записан
Максим
Гость
« Ответ #6 : 04-05-2009 19:40 » 

Огромное спасибо за помощь, даннные идут с ветерком Улыбаюсь.     Есть ещё вопрос по этому же тексту... Иакие массивы данных составляют 99% файла, но оставшийся процент тоже нужен. Его вылавливать по тому же принципу, расставив if'ы и выбирать по условию "если встретилась такая комбинация, то дальше данные занести в такую-то ячейку"? На всякий случай прилагаю бразец файла
Цитата
  05/12/08                         channel 1                            стp  1


  --------------------------   ОБЩАЯ  ЧАСТЬ       --------- 2.30 (504MD) ----
  METER ID:    0001001714              Пpогpам ID:  003
  ACCOUNT:     GO408-NOVOZIB1          Ном.пpогpамст:     0000
  Тип датчика: split-13                Веpсия           : 000204 05 H-128K(M)

  ------------------------ Х-КИ ПРОФИЛЯ НАГРУЗКИ   --------------------------
  Длина интеpвала:      30 Мин         Число дней хpанен: 320
  Масштабн.коэфц:            1         Поpог отк.питан.:            0 Сек.
  Данные канала   A: Потpеб            Данные канала   B: Выдача

  -------- Uн  (импульсы) кAнAл        A [ук - нное кол-о ] Потреб ----------
 
  00:30  00062   00058        00052   00044        00042   00041
  03:30  00039   00039        00037   00037        00049   00061
  06:30  00068   00067        00000   00000        00001   00001
  09:30  00014   00020        00030   00036        00041   00042
  12:30  00024   00012        00016   00015        00009   00017
  15:30  00006   00007        00030   00110        00118   00146
  18:30  00160   00169        00169   00170        00159   00150
  21:30  00132   00126        00126   00119        00160   00197

  Втp 02/12/08  Общая: 03228  низ: 00000  в  07:30  пик : 00197  в  24:00
и последний вопрос как выловить из этой строки дату - Втp 02/12/08.
Не прошу сделать за меня, прошу чтобы указали в какую сторону искать ... Спасибо.
Записан
Максим
Гость
« Ответ #7 : 09-05-2009 19:41 » 

у меня вот что получилось
Код:
 for j:=0 to Memo1.Lines.Count-1 do
      begin
        s:=Memo1.Lines.Strings[j];
        DateSeparator:= '/';     
        t:= Copy(s,1,15);
        t:= Trim(t);
        myDate := StrToDate('15/03/75');
        StatusBar1.Panels[1].text := DateTimeToStr(myDate);
    //  StatusBar1.Panels[2].text := t;
        StringGrid1.Cells[0,j] :=IntToStr(s);
       
при этом myDate выводится, а вот строка-дата из файла ни в какую
в остальных строчках абракадабра конечно, но сейчас интересут именно дата, с остальным потом разберусь.
Если можете, ткните носом где я неправ...
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-05-2009 16:04 » 

почему t:= Copy(s,1,15);?
Записан

С уважением, Oldy.
Максим
Гость
« Ответ #9 : 14-05-2009 17:25 » new

потому что в строке s, начиная с 1-го до 15 символа находится значение "15/03/75"
на самом деле вопрос уже решён, моя ошибка: в строке Memo1.Lines.Strings[j] отсутствует дата.
Уже исправвил. Oldi? спасибо за проявленый интерес... Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines