|
Вопрос # 2 471/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
У меня возникла проблемма, всё никак нормальным образом не могу считать имеющийся текстовый фаил и с ним работать...Фаил просто представляет из себя набор строк и в каждой строке 0-4 строковых элементов...(0-пустая строка).
Делов том, что в файле может быть много строчек и работа будет медленной если использовать AssignFile....
Я вот попробовал считывать данный фаил используя TStrings...см приложение
Но наворочено получилось в нём много, думаю можно много проще...
И вопрос по работе со считанными данными, я понимаю что это сугубо индивидуально, и каждый по разному может работать, вот в данный момент я записываю фаил в динамический массив и далее с ним работаю, а можно использовать потоки, правда не знаю как этого сделать... Застопарился я на динамических массивах, всё никак не могу перейти на ооп, толчка нехватает...
Да и дальнейшая работа заключается в разбиении этого фала на группы, делаю я это опять же динамическими массивами--что в конечном случае становится очень неудобным и сложным...
В архиве прикрепляю мою програмку целиком, с файлом из которого нуно взять инфу(AreaCounter)Конечным результатом должен получиться экселевский фаил...Посмотрите пожалуйста кому не лень...
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- type
- FuncResultU2 = array of array of string;
- TMyClassU2 = class(TForm)
- private
- { Private declarations }
- public
- { Public declarations }
- function FiletoMassive(Name:string):FuncResultU2;
- end;
-
-
- var
- MyClassU2:TMyClassU2;
-
- implementation
-
- uses unit1,unit3;
-
- { MyClass }
-
- function TMyClassU2.FiletoMassive(Name: string):FuncResultU2;
- var s1,s2:TStrings;
- i,j:integer;
- d:string;
- k:pChar;
-
- Results:FuncResultU2;
- Row,Col:integer;
- begin
- s1:=TStringList.Create;
- s2:=TStringList.Create;
- Col:=-1;
- Row:=-1;
- try
- s1.LoadFromFile(Name);
- SetLength(Results,s1.Count+1,4);
- for i:=0 to s1.Count-1 do
- begin
- Row:=Row+1;
- s2.Add(s1.Strings[i]);
- s2.QuoteChar:=' ';
- s2.Delimiter:=' ';
- k:=PChar(' '+s2.DelimitedText+' ');
- d:='';
- j:=0;
- while j<=Length(k) do
- begin
- if k[j]<>' ' then
- d:=d+k[j]
- else
- if d<>'' then
- begin
- Col:=Col+1;
- if Col<=3 then
- Results[Row,Col]:=d
- else
- j:=Length(k);
- d:='';
- end;
- j:=j+1;
- end;
- Col:=-1;
- s2.Clear;
- Application.ProcessMessages;
- end;
- FiletoMassive:=Results;
- except
-
- s1.Clear;
- s1.Free;
- s2.Clear;
- s2.Free;
- FiletoMassive:=nil;
- end;
- s1.Clear;
- s1.Free;
- s2.Clear;
- s2.Free;
- end;
 |
Вопрос задал: Arriba (статус: Посетитель)
Вопрос отправлен: 1 марта 2009, 23:42
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 2 марта 2009, 22:53; участников в обсуждении: 2.
|
Мережников Андрей (статус: Абитуриент), 2 марта 2009, 00:15 [#1]:
все таки непонятно, чего Вы хотите добиться от файла. Было бы проще, если бы Вы поделились идеей получения конечного результата. И форматом файла (что Вы подразумеваете,например, под строковым элементом?)
|
|
Arriba (статус: Посетитель), 2 марта 2009, 01:39 [#2]:
Извиняюсь чёт я загнул, это коллисечтво слов в одной строке...
Опишу полностью...Есть фаил areacounter.rox--текстовй фаил, я в Unit2 считываю данный фаил в массив динамический размером в 4 столбика(не взирая на то что в файле может в одной строчке быть больше чем 4 слова) и строк столько сколько в файле+1.После загрузки я передаю этот массив в Unit3, Unit1 служит как бы связкой,остальных Unit'ов, далее в Unit3 я считываю часть данных из исходного динамического массива в 4 динамических массива(тут получается массив массивов-например[][,])Эти массивы выглядят примерно как первые 4 таблицы в экселевском файле(в архиве который).Далее снова через Unit1 все полученные данные я передаю в Unit4 в котором происходит формирование 5 динамического массива(соответствует частично 5 таблице из экселевского файла в архиве) Формируется шапка выходного файла и записывается как бы первый считанный блок... потом программа переходит в Unit5 в котором происходят проверки на различия одной части файли со следующей и если нужно перезаписываются массивы и данные вносятся в конечный экселевский фаил, после чего он выдаётся сообщение о сохранении и сохраняется...
Данный способ очень мудрёный с использованием динамичих массивов, я уже сам конкретно путатться начинаю...поэтому хочу переделать и оптимизировать, упрастив считывание файла, и отказавшись от использования динамических массивов...
|
|
Arriba (статус: Посетитель), 2 марта 2009, 01:43 [#3]:
Конкретно формат исходного файла легко понимается после того как сравнишь фаил areacounter.rox с полученной в конце концов экселевской таблицей...
|
|
Мережников Андрей (статус: Абитуриент), 2 марта 2009, 20:19 [#4]:
каким символом разделяются слова в строке и что происходит с лишними словами?
|
|
Arriba (статус: Посетитель), 2 марта 2009, 22:53 [#5]:
Очень просто, слова в строке разделяются пробелом, а лишние слова(т.е. если в строке больше 4 слов) просто игнорируются, в одну строку массива то считываю лишь 4 слова...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|