Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 471

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
У меня возникла проблемма, всё никак нормальным образом не могу считать имеющийся текстовый фаил и с ним работать...Фаил просто представляет из себя набор строк и в каждой строке 0-4 строковых элементов...(0-пустая строка).
Делов том, что в файле может быть много строчек и работа будет медленной если использовать AssignFile....
Я вот попробовал считывать данный фаил используя TStrings...см приложение
Но наворочено получилось в нём много, думаю можно много проще...
И вопрос по работе со считанными данными, я понимаю что это сугубо индивидуально, и каждый по разному может работать, вот в данный момент я записываю фаил в динамический массив и далее с ним работаю, а можно использовать потоки, правда не знаю как этого сделать... Застопарился я на динамических массивах, всё никак не могу перейти на ооп, толчка нехватает...
Да и дальнейшая работа заключается в разбиении этого фала на группы, делаю я это опять же динамическими массивами--что в конечном случае становится очень неудобным и сложным...

В архиве прикрепляю мою програмку целиком, с файлом из которого нуно взять инфу(AreaCounter)Конечным результатом должен получиться экселевский фаил...Посмотрите пожалуйста кому не лень...

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. type
  2. FuncResultU2 = array of array of string;
  3. TMyClassU2 = class(TForm)
  4. private
  5. { Private declarations }
  6. public
  7. { Public declarations }
  8. function FiletoMassive(Name:string):FuncResultU2;
  9. end;
  10.  
  11.  
  12. var
  13. MyClassU2:TMyClassU2;
  14.  
  15. implementation
  16.  
  17. uses unit1,unit3;
  18.  
  19. { MyClass }
  20.  
  21. function TMyClassU2.FiletoMassive(Name: string):FuncResultU2;
  22. var s1,s2:TStrings;
  23. i,j:integer;
  24. d:string;
  25. k:pChar;
  26.  
  27. Results:FuncResultU2;
  28. Row,Col:integer;
  29. begin
  30. s1:=TStringList.Create;
  31. s2:=TStringList.Create;
  32. Col:=-1;
  33. Row:=-1;
  34. try
  35. s1.LoadFromFile(Name);
  36. SetLength(Results,s1.Count+1,4);
  37. for i:=0 to s1.Count-1 do
  38. begin
  39. Row:=Row+1;
  40. s2.Add(s1.Strings[i]);
  41. s2.QuoteChar:=' ';
  42. s2.Delimiter:=' ';
  43. k:=PChar(' '+s2.DelimitedText+' ');
  44. d:='';
  45. j:=0;
  46. while j<=Length(k) do
  47. begin
  48. if k[j]<>' ' then
  49. d:=d+k[j]
  50. else
  51. if d<>'' then
  52. begin
  53. Col:=Col+1;
  54. if Col<=3 then
  55. Results[Row,Col]:=d
  56. else
  57. j:=Length(k);
  58. d:='';
  59. end;
  60. j:=j+1;
  61. end;
  62. Col:=-1;
  63. s2.Clear;
  64. Application.ProcessMessages;
  65. end;
  66. FiletoMassive:=Results;
  67. except
  68.  
  69. s1.Clear;
  70. s1.Free;
  71. s2.Clear;
  72. s2.Free;
  73. FiletoMassive:=nil;
  74. end;
  75. s1.Clear;
  76. s1.Free;
  77. s2.Clear;
  78. s2.Free;
  79. end;


Arriba Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Arriba (статус: Посетитель)
Вопрос отправлен: 1 марта 2009, 23:42
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 2 марта 2009, 22:53; участников в обсуждении: 2.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 2 марта 2009, 00:15 [#1]:

все таки непонятно, чего Вы хотите добиться от файла. Было бы проще, если бы Вы поделились идеей получения конечного результата. И форматом файла (что Вы подразумеваете,например, под строковым элементом?)
Arriba

Arriba (статус: Посетитель), 2 марта 2009, 01:39 [#2]:

Извиняюсь чёт я загнул, это коллисечтво слов в одной строке...

Опишу полностью...Есть фаил areacounter.rox--текстовй фаил, я в Unit2 считываю данный фаил в массив динамический размером в 4 столбика(не взирая на то что в файле может в одной строчке быть больше чем 4 слова) и строк столько сколько в файле+1.После загрузки я передаю этот массив в Unit3, Unit1 служит как бы связкой,остальных Unit'ов, далее в Unit3 я считываю часть данных из исходного динамического массива в 4 динамических массива(тут получается массив массивов-например[][,])Эти массивы выглядят примерно как первые 4 таблицы в экселевском файле(в архиве который).Далее снова через Unit1 все полученные данные я передаю в Unit4 в котором происходит формирование 5 динамического массива(соответствует частично 5 таблице из экселевского файла в архиве) Формируется шапка выходного файла и записывается как бы первый считанный блок... потом программа переходит в Unit5 в котором происходят проверки на различия одной части файли со следующей и если нужно перезаписываются массивы и данные вносятся в конечный экселевский фаил, после чего он выдаётся сообщение о сохранении и сохраняется...
Данный способ очень мудрёный с использованием динамичих массивов, я уже сам конкретно путатться начинаю...поэтому хочу переделать и оптимизировать, упрастив считывание файла, и отказавшись от использования динамических массивов...
Arriba

Arriba (статус: Посетитель), 2 марта 2009, 01:43 [#3]:

Конкретно формат исходного файла легко понимается после того как сравнишь фаил areacounter.rox с полученной в конце концов экселевской таблицей...
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 2 марта 2009, 20:19 [#4]:

каким символом разделяются слова в строке и что происходит с лишними словами?
Arriba

Arriba (статус: Посетитель), 2 марта 2009, 22:53 [#5]:

Очень просто, слова в строке разделяются пробелом, а лишние слова(т.е. если в строке больше 4 слов) просто игнорируются, в одну строку массива то считываю лишь 4 слова...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 4 апреля 2020, 06:39
Выполнено за 0.01 сек.
Рейтинг@Mail.ru