Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2015, 18:52   #1
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию Парсинг txt (WINAPI)

Подскажите как осуществить парсинг в txt файле на winapi. Необходимо выдернуть нужные данные из txt файла и передать в переменную.
HTTqp вне форума Ответить с цитированием
Старый 16.09.2015, 19:15   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так прямо WINAPI? Читать файл CreateFile, ReadFile, CloseHandle. Работа с текстовыми строками - ну допустим Shell String Handling Functions. Ток не видел еще, чтобы делфисты парсили текст чисто винайпишными средствами
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.09.2015, 19:16   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут винапи? В ВинАпи есть функция для открытия файла (CreateFile с соотв. флагами) и для чтения байт из него (ReadFile).

В Дельфи есть гораздо более удобные обертки для чтения текста из файла.

Ну а каким уж алгоритмом доставать оттуда данные вам надо придумывать самому, волшебной функции для этого нигде нет. Если файл какого-то определенного текстового формата (XML, JSON, ini, ...), то для облегчения их парсинга есть библиотеки, в т.ч. и в стандартных Дельфи.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2015, 19:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
HTTqp
А как файл выглядит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2015, 20:06   #5
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А как файл выглядит?
Вообщем поискав нашел вот такой код:
Код:
function ReadFirstLine(filename : String) : Boolean;
var
  dFile, p : Integer;
  buff : Pointer;
  read : Cardinal;
  buf : array[0..1023] of Char; //Объявляем буфер, в который будем производить чтение
 str : String;
begin
  Result := false;
  dFile := CreateFile(PChar(filename), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);

  if (dFile <> INVALID_HANDLE_VALUE) then begin
   Str := "";
   repeat
    ReadFile(dFile, Buf, SizeOf(buf), read, nil);
    Str := Str + Copy(buf, 1, read);
    p := Pos(#13#10, Str);
   until (p > 0) or (SizeOf(buf) <> read); //Если дошли до конца файла или найден признак конца строки, выходим

  ShowMessage(Format("The first line of the file "%s" is the following: "#13#10#13#10"%s", [filename, Str]));
   Result := true;
  end;

  CloseHandle(dFile);
end;
Текстовый файл выглядит вот так:

Код:
# update link:
#
# Url1 =            "http://**********.ru"   

# send link:
# Url1 =      "http://**********.ru"
Мне нужно скопировать адрес указанный url1 иногда url2, без ковычек, причем количество пробелов не известно. Может один, а может 2.
HTTqp вне форума Ответить с цитированием
Старый 16.09.2015, 20:21   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Похоже тебе нужно что-то типа:
Код:
var s,s2:ansistring;
      h:THandle; z,i,b,e:Cardinal;
begin
 h:=CreateFile('d:\1\q.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 if h=0 then exit;
 z:=GetFileSize(h,@i);
 SetLength(s,z);
 ReadFile(h, s[1], Length(s), i, nil);
 //CloseHandle(h);
 b:=1;
 while b<>0 do begin
   b:=pos(#13#10,s); s2:=copy(s,1,b); delete(s,1,b+1);
   s2:=StringReplace(s2,' ','',[rfReplaceAll]);
 end;
 SetLength(s,0);
end;
Но почему WinAPI действиетльно...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2015, 20:25   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зачем париться с WinApi, когда в Дельфи есть либо TStringList с LoadFromFile, либо TFileStream?

А про данные, ну используйте Pos для нахождения Url1 и потом копируйте от после = и до конца строки. И Trim.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2015, 20:32   #8
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Похоже тебе нужно что-то типа:
Код:
var s,s2:ansistring;
      h:THandle; z,i,b,e:Cardinal;
begin
 h:=CreateFile('d:\1\q.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 if h=0 then exit;
 z:=GetFileSize(h,@i);
 SetLength(s,z);
 ReadFile(h, s[1], Length(s), i, nil);
 //CloseHandle(h);
 b:=1;
 while b<>0 do begin
   b:=pos(#13#10,s); s2:=copy(s,1,b); delete(s,1,b+1);
   s2:=StringReplace(s2,' ','',[rfReplaceAll]);
 end;
 SetLength(s,0);
end;
Но почему WinAPI действиетльно...
что то не понимаю что то не так, как выдернуть url1?

Winapi? потому что учусь на 4 курсе, препод поклоник полного описания всего руками, формы, процедур обработки сообщений и т.п.
HTTqp вне форума Ответить с цитированием
Старый 16.09.2015, 21:05   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
что то не понимаю что то не так, как выдернуть url1?
Может лучше сразу процедуру MakeEverythingOK()?

Это чтение содержимого файла, вроде по строкам. Данные сами доставайте как выше написано.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.09.2015, 21:18   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Данные сами доставайте как выше написано.
Дак я ему достал данные
Просто потом проверять
Код:
if copy(s2,1,4)='url1' then чет делаем.
Цитата:
препод поклоник полного описания всего руками
Тогда мой пример можешь выкинуть фтопку, он не подойдет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг данных *.txt Shouldercannon Общие вопросы Delphi 10 04.01.2017 22:44
Переделавание кода на считывание из файла в файл output.txt input.txt !!! airesjke Помощь студентам 0 29.05.2013 14:07
парсинг txt: это возможно? bambarbia Общие вопросы C/C++ 20 11.02.2013 18:16
Парсинг txt с разделителями табуляцией AlexKhol Общие вопросы Delphi 16 18.03.2012 18:33
WinAPI vs MSDN (парсинг командной строки) ds.Dante Win Api 5 03.03.2012 08:41