Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 319
1

Считать данные разделённые пробелами из текстового файла в StringGrid

24.02.2019, 14:53. Показов 2238. Ответов 11
Метки нет (Все метки)

Здравствуйте! Помогите заполнить StringGrid из текстового файла. Заранее количество строк и столбцов неизвестно, данные тоже разного типа. Единственное данные в строках разделены пробелами. В интернете есть примеры, но в основном данные формата файла формируются при сохранении StringGrid из приложения, а уже при загрузке они учитываются. Например
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var
F:File of TStr;
i,j:integer;
Str:TStr;
begin
try
AssignFile(F,'test.dat');
Rewrite(F);
Str.ccount:=StringGrid1.ColCount;
Str.rcount:=StringGrid1.RowCount;
for i:=0 to StringGrid1.RowCount-1 do
begin
for j:=0 to StringGrid1.ColCount-1 do
begin
Str.value:=StringGrid1.Cells[j,i];
Write(F,Str);
end;
end;
и
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,n,m,kk:integer;
F:File of TStr;
begin
try
kk:=0;
AssignFile(F,'test.dat');
Reset(F);
Seek(F,0);
Read(F,Str);
n:=Str.rcount;
m:=Str.ccount;
StringGrid1.RowCount:=n;
StringGrid1.ColCount:=m;
for i:=0 to n-1 do
begin
for j:=0 to m-1 do
begin
Seek(F,kk);
Read(F,Str);
StringGrid1.Cells[j,i]:=Str.value;
inc(kk);
end;
end;
CloseFile(F);
except
on e:Exception do
end;
end;
Меня это немного не устраивает.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2019, 14:53
Ответы с готовыми решениями:

Считать в несколько массив числа разделенные пробелами из текстового файла
Доброго времени суток, товарищи программисты. Вопрос следующего характера. Как считать числа,...

Считать из файла числа, разделенные пробелами и переводом на новую строку
При считывании нужно записать каждое число в массив. И лучше всего сначала узнать кол-во этих...

Как считать данные из файла, разделённые пробелом
Здравствуйте. Такая проблема: нужно считать данные из файла, которые разделены пробелом или...

Описать структуру с полями, считать данные из текстового файла, вывести данные, подсчитать количество
Доброе утро. С C# я знаком весьма посредственно, однако появилась необходимость выполнить на нем...

11
Почетный модератор
64087 / 47496 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
24.02.2019, 15:23 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//загрузить файл
procedure TForm1.Button1Click(Sender: TObject);
var t:TStringList;
    n,i:word;
begin
t:=TStringList.Create; //создадим экземпляр класса
t.LoadFromFile('text.txt'); //загрузим в него файл из папки с программой
StringGrid1.Options:=StringGrid1.Options - [goFixedRowNumbering]; //уберем фиксированные строки и столбцы
Stringgrid1.RowCount:=t.Count;//количество строк
n:=1;//прочитаем количество столбцов по 1-й строке
for i:=1 to length(t[0]) do
if t[0][i]=' ' then inc(n);
StringGrid1.ColCount:=n; //количество столбцов
for i:=0 to t.Count-1 do
with StringGrid1 do
 begin
 //заполним строки и столбцы
  Rows[i].Delimiter:=' '; //пусть в строках между словами пробел
  Rows[i].DelimitedText:=t[i]; //вставим строку, разбитую на слова
 end;
t.Free;
end;
1
Модератор
7479 / 4894 / 2046
Регистрация: 21.01.2014
Сообщений: 20,811
Записей в блоге: 3
24.02.2019, 15:34 3
Цитата Сообщение от GAZot Посмотреть сообщение
данные тоже разного типа
Если это именно текстовый файл - данные в нем одного типа - текст и ничего иного!
Цитата Сообщение от GAZot Посмотреть сообщение
Единственное данные в строках разделены пробелами
Вообще проблем нет...
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var L: TStringList;
      i, j: integer;
...
L := TStringList.Create;
L.LoadFromFile('test.dat');
StringGrid1.RowCount := L.Count;
for i := 0 to L.Count - 1 do
 begin
  j := Length(L.Strings[i]) - Length(StringReplace(L.Strings[i], ' ', '', [rfReplaceAll])) + 1; 
  if StringGrid1.ColCount < j then StringGrid1.ColCount := j;
  StringGrid1.Rows[i].CommaText := L.Strings[i];
 end;
L.Free;
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 319
24.02.2019, 16:57  [ТС] 4
Спасибо, а можно как то автоматом ширину строк выравнивать по самому длинному значению
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31466 / 20513 / 7988
Регистрация: 22.10.2011
Сообщений: 35,639
Записей в блоге: 7
24.02.2019, 17:28 5
Лучший ответ Сообщение было отмечено D1973 как решение

Решение

Не нужно в Лазарусе никаких дополнительных StringList-ов:
Pascal
1
  StringGrid1.LoadFromCSVFile('test.dat', ' ');
прекрасно справляется с вышеозвученным заданием.
0
Почетный модератор
64087 / 47496 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
24.02.2019, 17:40 6
Цитата Сообщение от GAZot Посмотреть сообщение
а можно как то автоматом ширину строк выравнивать по самому длинному значению
Pascal
1
2
3
4
5
6
7
8
9
10
11
imx:=0;
jmx:=0;
for i:=0 to StringGrid1.RowCount-1 do
for j:=0 to StringGrid1.ColCount-1 do
if length(StringGrid1.Cells[j,i])>m then
 begin
   imx:=i;
   jmx:=j;
 end;
for i:=0 to StringGrid1.ColCount-1 do
StringGrid1.ColWidths[i]:=StringGrid1.Canvas.TextWidth(StringGrid1.Cells[imx,jmx]);
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31466 / 20513 / 7988
Регистрация: 22.10.2011
Сообщений: 35,639
Записей в блоге: 7
24.02.2019, 18:02 7
Цитата Сообщение от GAZot Посмотреть сообщение
ширину строк выравнивать по самому длинному значению
В каждом столбце, или в целом по всему гриду? Если в каждом столбце - то можно просто вызвать:
Pascal
1
StringGrid1.AutoSizeColumns;
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 319
24.02.2019, 19:23  [ТС] 8
Спасибо всем.
D1973 и Puporev хотя уже не важно, но что то в ваших кодах не работает
0
Почетный модератор
64087 / 47496 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
24.02.2019, 19:26 9
Значит списать толку нет, перед тем как выложить я, да и наверняка D1973, D1973, все проверял и все работало.
0
Модератор
7479 / 4894 / 2046
Регистрация: 21.01.2014
Сообщений: 20,811
Записей в блоге: 3
25.02.2019, 04:17 10
Цитата Сообщение от GAZot Посмотреть сообщение
что то в ваших кодах не работает
Это не диагноз. Покажите, что именно не работает, покажите, как это написано именно у Вас - вот тогда это будет предметный разговор...
Цитата Сообщение от GAZot Посмотреть сообщение
хотя уже не важно
Ну вот и славно...
0
0 / 0 / 0
Регистрация: 25.04.2015
Сообщений: 319
25.02.2019, 20:25  [ТС] 11
D1973 и Puporev. Ребят без обид, может я не прав посмотрите сами!
Вложения
Тип файла: rar Проба.rar (2.97 Мб, 10 просмотров)
0
Модератор
7479 / 4894 / 2046
Регистрация: 21.01.2014
Сообщений: 20,811
Записей в блоге: 3
26.02.2019, 06:32 12
GAZot, просто предупреждать было надо, что там запятые есть... Вот именно для этого всегда и просим выкладывать реальные данные, с которыми работать придется, а то вот так и получается, зададите абстрактный вопрос, получите абстрактный ответ и потом утверждаете, что не работает...
В моем случае просто надо заменить CommaText на DelimitedText и, соответственно, Delimiter := #32 установить. Но как это проще сделать в Lazarus - volvo показал, в Delphi такой плюшки, к сожалению, нету...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2019, 06:32

Считать данные из текстового файла
Всё не так просто. Дан текстовый файл, в нём строка типа lo8vd76gjo6asd, нужно считать ТОЛЬКО...

Считать данные из текстового файла
Здравствуйте форумчане у меня есть разделенная БД, сотрудники отдела АДМ(назовем так) пополняют...

Считать данные с текстового файла, и изменить их
Добрый вечер. Есть текстовый файл(txt). Пример: 001\Мастер и Маргарита\Булгаков\есть\3 002\Над...

Считать данные текстового файла в массив
Здравствуйте знатоки. Есть файл file.txt в котором содержатся числа например массив из 5 символов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru