Текущий архив: 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.035 c