Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Как найти символ табуляции в строке?   Найти похожие ветки 

 
z3f   (2004-05-30 17:35) [0]

Глупый вопрос конечно, но я не могу его решить.=(
Есть текстовый файл с разделителями в строках (символ табуляции). После табуляции стоят числа.
Файл:
1. Опа      232425 руб
2. Ага      7678890 руб

Сумма ?
Нужно выловить числа и сосчитать сумму.
Вопрос простой, ноя не могу вспомнить как определить символ табуляции и наличие пробела (в принципе пробел это st=" "??).
А вот как быть с табуляцией?

С уважением z3f.


 
Gero ©   (2004-05-30 17:38) [1]

#9


 
z3f   (2004-05-30 18:37) [2]

Еще вопрос в принципе по тому же поводу=(

Код:
Repeat
    while not EOLN(f_old) do
     begin
     read (f_old,ch);
     write (f_new,ch);
     stf:=" ";
     if ch=#9 then
         begin
           while ch<>" " do
           begin
             read(f_old,ch);
             stf:=stf+ch;
           end;
           write (f_new,stf);
           val(stf,m,j);
           setlength (a,i);
           a[i]:=m;
           inc(i);
         end;
    end;
    writeln(f_new);
    readln(f_old);
    Until eof(f_old);
ch - переменная типа char
stf - переменная типа string
по первому проходу по строке(когда находит число) отлично сохранняет в массиве числовое значение.
по второму проходу когда натыкается на число проиходит ошибка в выделенной строке.
Не подскажите в чем проблема?


 
Gero ©   (2004-05-30 18:42) [3]

Ужасный код...
Как объявлены f_old и f_new?
Что вобще этот код должен сделать в процессе работы?


 
z3f   (2004-05-30 18:53) [4]

Код:
procedure TForm2.Button1Click(Sender: TObject);
var f_old, f_new : TextFile; // f_new - test_new.txt, f_old - test.txt
   st,str,stf : string;
   a: array of Integer;
   i,j,m: Integer;
   ch: char;
begin
  if FileExists("test_new.txt") then   // если новый файл есть - тады удаляем его
     begin
       AssignFile(f_new,"test_new.txt");
       Reset(f_new);
       CloseFile(f_new);
       Erase(f_new);
     end;
// создаем новый файл с именем test_new.txt
  AssignFile(f_new,"test_new.txt");
  AssignFile(f_old,"test.txt");
  ReSet(f_old);  //только читаем test.txt
  ReWrite(f_new); //пишем в файл test_new.txt
  i:=1;
//обрабатываем исходный файл и результат обработки записываем в новый файл
  Repeat
    while not EOLN(f_old) do
     begin
     read (f_old,ch);
     write (f_new,ch);
     stf:="";
     if ch=#9 then
         begin
           while ch<>" " do
           begin
             read(f_old,ch);
             stf:=stf+ch;
           end;
           write (f_new,stf);
           val(stf,m,j);
           setlength (a,i);
           a[i]:=m;
           inc(i);
         end;
    end;
    writeln(f_new);
    readln(f_old);
    Until eof(f_old);
//конец обработки исходного файла
  CloseFile (f_old);
  CloseFile (f_new);
  Form1.Show; // показываем окно с результатами
  Form2.Hide; // прячем окно с исходным текстом
end;

Задача такая - есть текстовый файл вида:
Справка за июль месяц.
Стоимость по одному виду  23434 тыс руб
Стоимость по второму виду  938 тыс руб
Стоимость по третьему виду  23 тыс руб
Сумма  26 тыс руб

Требуется сосчитать сумму нечетных значений.
Упростил на данный момент - просто сосчитать сумму всех значений и соответственно вывести в новый файл (test_new.txt).
Выгребаю все числа из строчек (плевать - даже сумму на первом этапе)и закидываю их в массив (a[i]).
Все нормально по первому проходу.
После него a[1]=23434
stf=23434.
потом stf=""становится.
И когда второй раз программа набредает на число(в данном случае 9) ломается на фразе stf:=stf+ch.

Вот такая проблема.

С уважением z3f.


 
Gero ©   (2004-05-30 19:13) [5]

function GetFileSum(FName : string) : Integer;
var
 S : string;
 i : Integer;
begin
 Result := 0;
 with TStringList.Create do
   try
     LoadFromFile(FName);
     for i := 0 to Count -1 do
       begin
         S := Strings[i];
         S := Copy(S, Pos(#9, S) + 1, Length(S) - Pos(#9, S));
         S := Copy(S, 1, Pos($20, S) - 1);
         Result := Result + StrToIntDef(S, 0);
       end;
   finally
     Free;
   end;
end;


Не проверял..


 
z3f   (2004-05-30 19:32) [6]

[Ошибка] Proba_bank_2.pas(45): Incompatible types
[Ошибка] Proba_bank_2.pas(95): Undeclared identifier: "Count"
[Ошибка] Proba_bank_2.pas(96): Missing operator or semicolon
[Ошибка] Proba_bank_2.pas(16): Unsatisfied forward or external declaration: "TForm2.GetFileSum"
[Фатальная ошибка] Proba_bank_prj.dpr(6): Could not compile used unit "Proba_bank_2.pas"

Это вот такое выдается=)
Проблема в том что нужно каком образом(правльным) добавлять к string переменную типа char. Я по ходу это делаю неправильно! (по моему).

Кроме того нужно выполнять еще массу операций над числами - это не единственное что нужно сделать. Поэтому нужно забивать таким образом массив (просто с ним в итоге будет проще работать!).

Может есть какое-либо другое решение?
Помогите!

С уважением z3f.


 
Gero ©   (2004-05-30 19:50) [7]

Блин, ну что подумать совсем никак?
Или F1 нажать?

var A : array of Integer;

procedure FillArray(FName : string);
var
 S : string;
 i, NumCount : Integer;
begin
 with TStringList.Create do
   try
     LoadFromFile(FName);
     SetLength(A, Count);
     NumCount := 0;
     for i := 0 to Count -1 do
       begin
         S := Strings[i];
         S := Copy(S, Pos(#9, S) + 1, Length(S) - Pos(#9, S));
         S := Copy(S, 1, Pos(" ", S) - 1);
         A[NumCount] := StrToIntDef(S, -1);
         if A[NumCount] > -1 then Inc(NumCount);
       end;
   finally
     Free;
   end;
end;

Код, правда, далеко не идеален, но будет работать.


 
z3f   (2004-05-30 20:53) [8]

Послушался Вашего совета Gero.
Все работает=) Практически=)
Проходит практически весь файл но на очередно readln - дохнет.=(
Тектовый файл:
Справка за июль месяц.

Стоимость по одному виду  23434 тыс руб
Стоимость по второму виду  938 тыс руб
Стоимость по третьему виду  23 тыс руб
Стоимость по четвертому виду  4895 тыс руб
Сумма  26 тыс рубл

Когда доходит до строки Сумма  26 тыс рубл - readln - дохнет=(
Говорит - invalid pointer=(
КОД:

procedure TForm2.Button1Click(Sender: TObject);
var F_OLD, F_NEW : TextFile; // f_new - test_new.txt, f_old - test.txt
   st : string;
   a : array of Integer;
   i : Integer;
begin
  AssignFile(F_NEW,"test_new.txt");
  AssignFile(F_OLD,"test.txt");
  ReSet(F_OLD);  //только читаем test.txt
  ReWrite(F_NEW); //пишем в файл test_new.txt
  i:=1;
  Repeat
    Readln(F_OLD, st); //здесь дохнем с ошибкой Invalid Pointer=(
    St := Copy(St,Pos(#9,St)+1,Length(St)-Pos(#9,St));
    St := Copy(St,1,Pos(" ",St)-1);
    SetLength(A, i);
    A[i] := StrToIntDef(St, -1);
    if A[i]>-1 then
     begin
       writeln(F_NEW,a[i]);
       Inc(i);
     end;
  Until eof(F_OLD);
  CloseFile(F_OLD);
  CloseFile(F_NEW);
  Form2.Hide; // прячем окно с исходным текстом
  Form1.Show; // показываем окно с результатами
end;
Помогите еще раз опжалуйста!

С уважением z3f.


 
GEN++ ©   (2004-05-30 21:36) [9]

>z3f  
А что мешает загрузить входной файл в StringList1 далее
обрабатывать каждую строку и результат писать в StringList2,
по окончании операции сохранять StringList2 в файле.


 
Anatoly Podgoretsky ©   (2004-05-30 21:45) [10]

Gero ©   (30.05.04 19:50) [7]
Ну парень ты влетел :-)


 
z3f   (2004-05-30 22:04) [11]

Да не влетел он=)
Он все правльно написал - я просто не захотел вникнуть в код и разбираться с кодом который написал Gero ©=)
А он все правильно написал=)
Проcто после его кода я внимательно почитал что выдает F1 на каждую из им написанных функций и все понял.
Пришлось немного адаптировать под себя и все - заработало!!!!!

Всем громадное спасибо за помощь!!!

С уважением z3f.



Страницы: 1 вся ветка

Текущий архив: 2004.06.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
14-1085710974
Романов Р.В.
2004-05-28 06:22
2004.06.13
Американци посадили своего спамера на 7 лет!


3-1085088368
Lego82
2004-05-21 01:26
2004.06.13
Не могу создать поле в Paradoxe((


6-1082526541
atruhin
2004-04-21 09:49
2004.06.13
Перехват на контроллере домена. События входа пользователя.


6-1082774639
Graf
2004-04-24 06:43
2004.06.13
Счетчик траффика


4-1084062892
cemick
2004-05-09 04:34
2004.06.13
Запись файла в различное место ЖД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский