powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по строкам
5 сообщений из 5, страница 1 из 1
Вопрос по строкам
    #39492170
venza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вышел после отпуска голова не соображает...

такая ситуЁвина =)

Есть огромный текстовый файл (фрагмент)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
[POLYGON]
Type=0x13
Data0=(54.12902,51.54830),(54.12889,51.54802),(54.12897,51.54789),(54.12912,51.54817)
[END]

[POLYGON]
Type=0x13
Data0=(54.12897,51.53667),(54.12891,51.53654),(54.12897,51.53646),(54.12904,51.53659)
[END]

[POLYGON]
Type=0x13
Data0=(54.12895,51.54120),(54.12893,51.54107),(54.12906,51.54099),(54.12908,51.54114)
[END]

[POLYGON]
Type=0x13
Data0=(54.12904,51.52929),(54.12893,51.52910),(54.12902,51.52897),(54.12912,51.52918)
[END]



Как мне выдернуть точки полигонов? значения после Data[i]=
...
Рейтинг: 0 / 0
Вопрос по строкам
    #39492194
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
venza,

реплейснуть скобки в пусто, а запятые в перевод строки
результат положить в TStringList
после читать строчки. нечетные - первая координата, четные - вторая.
...
Рейтинг: 0 / 0
Вопрос по строкам
    #39492196
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
venza,
нанять программиста, знакомого с регулярными выражениями. На худой конец, умеющего юзать CommaText.
...
Рейтинг: 0 / 0
Вопрос по строкам
    #39492197
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
venza,

Можно разобрать строку. Заменяешь ( и , на пробел. Получаешь 8 чисел в строке. Выкусываешь начало строки до пробела в цикле - получаешь число. В общем - Pos() + Copy() в цикле.
...
Рейтинг: 0 / 0
Вопрос по строкам
    #39492648
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
venza,

От нечего делать за 15 минут немного наговнокодил:
Код: pascal
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
program data0;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  WinApi.Windows, System.Types, System.SysUtils, System.IOUtils;

type
  TXY = record
    X, Y: Extended;
  end;

  TCoords = array of TXY;

var
  FloatFormat: TFormatSettings;

function ParseData(Data: PChar): TCoords;
type
  TState = (stNone, stReady, stFirst, stSecond, stDone);
var
  First: PChar;
  Value: string;
  Index: Integer;
  State: TState;
  Coord: TXY;
begin
  State := stReady;
  Index := 0;
  First := Pointer($FFFFFFFF);
  while Data^ <> #0 do begin
    case Data^ of
      '(': begin
            State := stFirst;
            First := Data + 1;
           end;
      ',': begin
             Inc(State);
             if State = stSecond then begin
               SetString(Value, First, Data - First);
               Coord.X := StrToFloat(Trim(Value), FloatFormat);
               First := Data + 1;
             end;
           end;
      ')': begin
             Inc(State);
             SetString(Value, First, Data - First);
             Coord.Y := StrToFloat(Trim(Value), FloatFormat);
             First := Pointer($FFFFFFFF);
           end;
    end;
    Inc(Data);
    if State = stDone then begin
      if Index >= Length(Result) then
        SetLength(Result, Index + 4);
      Result[Index] := Coord;
      State := stNone;
      Inc(Index);
    end;
  end;
  if Index < Length(Result) then
    SetLength(Result, Index);
end;

procedure ParseFile(const Contents: TStringDynArray);
var
  Line: string;
  Coords: TCoords;
  XY: TXY;
begin
  for Line in Contents do begin
    if StrLIComp(PChar(Line), 'Data0=', 6) = 0 then begin
      Coords := ParseData(PChar(Line) + 6);
      WriteLn('Line: ', Line, sLineBreak);
      for XY in Coords do
        WriteLn('X: ', XY.X:8:5, ' Y: ', XY.Y:8:5);
      WriteLn;
    end;
  end;
end;

var
  Contents: TStringDynArray;
begin
  SetConsoleOutputCP(1251);
  try
    FloatFormat := TFormatSettings.Create;
    FloatFormat.DecimalSeparator := '.';
    Contents := TFile.ReadAllLines('D:\Projects\Test\test.txt');
    ParseFile(Contents);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.


Просто как пример, без обработки ошибок и прочих красивостей.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос по строкам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]