Чтение из файла

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

допустим есть текстовый файл содержащий следующие данные:

2 4 5 6 7
4 5 7 8 9
4 * 5 7 *
4 5 * 6 7
5 6 7 1 2

* - это пусто место

Как прочитать это файл и расставить каждое число в определенно место (каждой ячейки свое число) Stringgrid?

Да и если файл Excel как его прочитать и тоже расставить числа в ячейки, если ячейка Excel пустая, то и соответсвующая ячейка Stringgrid тоже пустая.
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

2 4 5 6 7
4 5 7 8 9
4 * 5 7 *
4 5 * 6 7
5 6 7 1 2
а с чем проблема?

Советую считать в TStringList и работать построчно. В приведенном примере можно вообще все нечетные символы пихать в таблицу...
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Код: Выделить всё

procedure ParseTextFile(StringGrid: TStringGrid; FileName: String);
Var
  SL : TStringList;
  posy, posx, i : Integer;
  S : String;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(FileName);
    For posy := 1 to SL.Count do
    begin
      posx := 1;  S := '';
      For i := 1 to Length(SL.Strings[posy-1]) do
        if SL.Strings[posy-1][i] <> ' ' then S := S + SL.Strings[posy-1][i]
        else begin
          if S <> '*' then StringGrid.Cells[posx, posy] := S;
          inc(posx); S := '';
        end;
      if (S <> '') and (S <> '*') then StringGrid.Cells[posx, posy] := S;
    end;
  finally
    StringGrid.RowCount := posy;
    StringGrid.ColCount := posx+1;
    SL.Free;
  end;
end;
пример вызова:

Код: Выделить всё

  ParseTextFile(StringGrid1, 'in.txt');
С уважением, Lost Angel...
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

YurikGL,
проблема из строки
"2 5 5 5 9 4 4 3 5 1 44 5 235 35"
извлечь все числа
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

где между числами может быть различное число пробелов
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Да и если файл Excel как его прочитать и тоже расставить числа в ячейки, если ячейка Excel пустая, то и соответсвующая ячейка Stringgrid тоже пустая.
Для Excel'я:

Код: Выделить всё

  uses ..., ExcelXP;
   ...
  TForm1 = class(TForm)
   ...
  private
    { Private declarations }
    procedure ParseExcelFile(StringGrid: TStringGrid; FileName: String);
   ...

procedure TForm1.ParseExcelFile(StringGrid: TStringGrid; FileName: String);
Var
  Excel : TExcelApplication;
  WorkBook : TExcelWorkbook;
  WorkSheet : TExcelWorksheet;
  i, j : Integer;
begin
  Excel := TExcelApplication.Create(self);
  WorkBook := TExcelWorkbook.Create(Excel);
  WorkBook.ConnectTo(Excel.WorkBooks.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
    EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, LOCALE_USER_DEFAULT));
  WorkSheet := TExcelWorksheet.Create(WorkBook);
  WorkSheet.ConnectTo(WorkBook.WorkSheets.Item[1] as _Worksheet);
  For i := 1 to VarArrayHighBound(WorkSheet.UsedRange[LOCALE_USER_DEFAULT].Value2, 1) do
    For j := 1 to VarArrayHighBound(WorkSheet.UsedRange[LOCALE_USER_DEFAULT].Value2, 2) do
      StringGrid.Cells[j, i] := WorkSheet.UsedRange[LOCALE_USER_DEFAULT].Value2[i,j];
  StringGrid.ColCount := VarArrayHighBound(WorkSheet.UsedRange[LOCALE_USER_DEFAULT].Value2, 2)+1;
  StringGrid.RowCount := VarArrayHighBound(WorkSheet.UsedRange[LOCALE_USER_DEFAULT].Value2, 1)+1;
  WorkBook.Close(False);
  Excel.Quit;
  if Assigned(WorkSheet) then FreeAndNil(WorkSheet);
  if Assigned(Workbook) then FreeAndNil(Workbook);
  if Assigned(Excel) then FreeAndNil(Excel);
end;
С уважением, Lost Angel...
Ответить