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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 6 657

/ вопрос открыт /

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

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

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Menus, XPMan, StdCtrls, Math;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Label1: TLabel;
  12. Label2: TLabel;
  13. Label3: TLabel;
  14. Edit1: TEdit;
  15. Edit2: TEdit;
  16. Edit3: TEdit;
  17. Label4: TLabel;
  18. Label5: TLabel;
  19. Button1: TButton;
  20. XPManifest1: TXPManifest;
  21. MainMenu1: TMainMenu;
  22. File1: TMenuItem;
  23. Open1: TMenuItem;
  24. OpenDialog1: TOpenDialog;
  25. Label6: TLabel;
  26. Label7: TLabel;
  27. Edit4: TEdit;
  28. procedure Open1Click(Sender: TObject);
  29. procedure Button1Click(Sender: TObject);
  30. private
  31. { Private declarations }
  32. public
  33. { Public declarations }
  34. end;
  35.  
  36. type Combine = record
  37. Str: String;
  38. LayerNum: Integer;
  39. End;
  40.  
  41.  
  42. Function ParseAndChangeTemp(ParseString,first,last: String):String;
  43. Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
  44.  
  45. Function AddString(Destination,Source:String; Position:Integer): String;
  46. Function CopyFromPosToEnd(Source: String; Position: Integer):String;
  47. Function CopyFromBegToPos(Source: String; Position: Integer):String;
  48. Procedure Make();
  49.  
  50. var
  51. Form1: TForm1;
  52. Mem1,Mem2: TMemoryStream;
  53. FilePath: string;
  54. Dest, Dest2: String;
  55.  
  56. layer,temp,NumRun,first,last,step: integer;
  57. LastString, S: String;
  58. i: integer;
  59. comb: combine;
  60. Pos,StringEnd: Cardinal;
  61. StringLength: Integer;
  62.  
  63. position, tmp: PChar;
  64. num, n: Cardinal;
  65.  
  66. Dst1,Dst2: String;
  67. Param1,Param2: PChar;
  68.  
  69. const
  70. z: string = 'G1 Z';
  71.  
  72. implementation
  73.  
  74. {$R *.dfm}
  75.  
  76. Function FindEndOfString(Pos: Cardinal; Mem: TMemoryStream):Cardinal;
  77. var
  78. ch: Char;
  79.  
  80. Begin
  81. ch:='0';
  82. while ((ch<>chr(13)) and (Pos<=Mem.Size-1)) do
  83. Begin
  84. Mem.Read(ch,1);
  85. Pos:=Pos+1;
  86. End;
  87. Result:=Pos;
  88. End;
  89.  
  90.  
  91.  
  92. Function ParseAndChangeTemp(ParseString,first,last: String):String;
  93. var
  94. pos, tmp,tmp2: PChar;
  95. num, n: integer;
  96. Rez: String;
  97.  
  98. Begin
  99. tmp:=PChar(ParseString);
  100. tmp2:=PChar(First);
  101. Rez:=ParseString;
  102. While StrPos(tmp,tmp2)<>nil do
  103. Begin
  104. Dest:='';
  105. Dest2:=last;
  106.  
  107. pos:=StrPos(tmp,PChar(First));
  108.  
  109. num:=Cardinal(pos)-Cardinal(tmp)-1;
  110. Dest:=CopyFromBegToPos(ParseString,num);
  111.  
  112. num:=num+Length(First)+1;
  113. Dest2:=CopyFromPosToEnd(ParseString,num);
  114.  
  115. num:=Length(Dest);
  116. Dest:=AddString(Dest,last,num);
  117.  
  118. num:=Length(Dest);
  119. Rez:=AddString(Dest,Dest2,num);
  120. tmp:=PChar(Rez);
  121. End;
  122.  
  123. Result:=Rez;
  124. End;
  125.  
  126.  
  127.  
  128. procedure TForm1.Open1Click(Sender: TObject);
  129. begin
  130. if OpenDialog1.Execute=True then
  131. FilePath:=OpenDialog1.FileName;
  132. end;
  133.  
  134.  
  135.  
  136. procedure TForm1.Button1Click(Sender: TObject);
  137. begin
  138. Make;
  139. end;
  140.  
  141.  
  142.  
  143.  
  144. Function AddString(Destination,Source:String; Position:Integer): String;
  145. Var
  146. DstLngth,SrcLngth: Integer;
  147. n: Integer;
  148. Ch: Char;
  149.  
  150. Begin
  151. DstLngth:=Length(Destination);
  152. SrcLngth:=Length(Source);
  153.  
  154. If ((Position<>0) and (Position<=DstLngth)) then
  155. Begin
  156. DstLngth:=Position+SrcLngth;
  157. SetLength(Destination,DstLngth);
  158. For n:=0 to (DstLngth-1) do
  159. Begin
  160. Ch:=Source[n+1];
  161. Destination[n+Position+1]:=Ch;
  162. End;
  163. End
  164. else
  165.  
  166.  
  167. Result:=Destination;
  168. End;
  169.  
  170.  
  171.  
  172.  
  173. Function CopyFromPosToEnd(Source: String; Position: Integer):String;
  174. Var
  175. TmpStr: String;
  176. StrLngth: Integer;
  177. Ch:char;
  178.  
  179. Begin
  180. StrLngth:= Length(Source);
  181. SetLength(TmpStr,(StrLngth-Position));
  182. If ((Position<=(StrLngth-1)) and (Position>0)) then
  183. Begin
  184. For n:=Position+1 to StrLngth do
  185. Begin
  186. ch:=Source[n];
  187. TmpStr[n-Position]:=Ch;
  188. End;
  189. End
  190. else
  191.  
  192.  
  193. Result:=TmpStr;
  194. End;
  195.  
  196.  
  197.  
  198.  
  199. Function CopyFromBegToPos(Source: String; Position: Integer):String;
  200. Var
  201. TmpStr: String;
  202. StrLngth: Integer;
  203. Ch:char;
  204.  
  205. Begin
  206. StrLngth:= Length(Source);
  207. SetLength(TmpStr,(StrLngth-(StrLngth-Position-1)));
  208. If ((Position>=0) and (Position<(StrLngth-1))) then
  209. Begin
  210. For n:=0 to (Position) do
  211. Begin
  212. ch:=Source[n+1];
  213. TmpStr[n+1]:=Ch;
  214. End;
  215. End
  216. else
  217.  
  218.  
  219. Result:=TmpStr;
  220. End;
  221.  
  222.  
  223.  
  224. Procedure Make();
  225. Begin
  226. Mem1:=TMemoryStream.Create;
  227. Mem2:=TMemoryStream.Create;
  228. Mem1.LoadFromFile(FilePath);
  229.  
  230. temp:=(StrToInt(Unit1.Form1.Edit2.Text)+1);
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. step:=Round(step/(last-first));
  238. i:=1;
  239.  
  240.  
  241.  
  242. Mem2.SetSize(0);
  243. while (Pos+1)<Mem1.Size do // <>
  244. Begin
  245.  
  246.  
  247.  
  248.  
  249. S:='';
  250.  
  251.  
  252.  
  253.  
  254. if i<=2 then
  255.  
  256. else
  257.  
  258.  
  259. if S<>LastString then
  260. i:=i+1;
  261.  
  262. Mem2.WriteBuffer(S,Length(S));
  263.  
  264. End;
  265.  
  266. Mem2.SaveToFile(FilePath);
  267.  
  268. Mem1.Free;
  269. Mem2.Free;
  270. End;
  271.  
  272. end.


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

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 28 апреля 2017, 17:22
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 35; последнее сообщение — 1 мая 2017, 11:23; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 17:30 [#1]:

Цитата (SOA):

Пример файла прикрепляю ниже.

гдебля?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 17:45 [#2]:

Чес слово прикреплял
Залил на яндекс диск
https://yadi.sk/d/iZX4Wybm3HTHd8
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 17:53 [#3]:

и чо?
такой длинный исходник для разбора такого простого текста?
проблема-то гдебля?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 17:54 [#4]:

и нахуа его парсить как бинарник? этож текст.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 17:58 [#5]:

Это просто пробник, сами файлы куда длиннее, этот просто проще отлаживать, и при отладке вроде бы все нормально, но вот когда поток в файл сохраняю, получается это

"Шh+  Њi+  ¤i+  Dj+  j+  k+  (k+  C ‰ F яяяя "
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:04 [#6]:

Короче, не еби себе мозг: если файлы текстовые, то и парсить надо текст, а не галимый кусок памяти.
Дай файл настоящий посмотреть и напиши, как его парсить надо, что должно быть на выходе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:12 [#7]:

и выходной файл, который хуёвый, тоже дай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:13 [#8]:

Не совсем понятно что вы понимаете под словами "парсить надо текст а не бинарник", потому что бинарные данные загружаются как текст в строковую переменную, в которой парсится уже сам текст и изменяется так как нужно, после чего сохраняется в поток памяти, а когда весь текст пройден, поток памяти сохраняется в этот же файл путем перезаписи.

Ссылку на настоящий файл прикрепляю ниже, раз вам интересно
https://yadi.sk/d/eethv7NS3HTKxQ

Смысл программки проанализировать GCode, и заменить там значения температур на нужные, а кое где и дописать нужные строки, т.к. сама программа пишется, для того, чтоб можно было бы сделать температурную башню для 3D принтера.

Выходной файл
https://yadi.sk/d/KV-RxIrg3HTLbh

Сам проект на Delphi7
https://yadi.sk/d/S7LXjImb3HTKiJ
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:18 [#9]:

Цитата (SOA):

что вы понимаете под словами "парсить надо текст а не бинарник"

Да, блин, построчно.
Загрузил в stringlist, пробежался по нему, вытащил какие надо данные (и добавил своих) в другой stringlist, и сохранил в файл.

Нахрена тебе этот головняк с бинарником?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:21 [#10]:

у тебя на выходе одни нули.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:22 [#11]:

С настоящим файлом ошибка вышла, вот настоящий
https://yadi.sk/d/eethv7NS3HTKxQ
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:25 [#12]:

С бинарником как то более цивильно получается, я сначала вообщес TMemo хотел работать, но потом передумал.
Потом хотел использовать функции для PChar строк, так как свои для обработки писать было лень, но при их использовании у меня возникла крайне непонятная ситуация, в которой первые 3 строки проходились и редактировались без проблем, а вот на 4 уже возникала ошибка обращения к памяти почему то, хотя ничего сверхестественного я там не делал.
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:26 [#13]:

Цитата (SOA):

С настоящим файлом ошибка вышла, вот настоящий

И это всё? Я уж думал, там файлы по пол-гига.
А это мелочь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:26 [#14]:

чо из этого файла в итоге получиться должно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:32 [#15]:

Цитата (SOA):

С бинарником как то более цивильно получается, я сначала вообщес TMemo хотел работать, но потом передумал. Потом хотел использовать функции для PChar строк, так как свои для обработки писать было лень, но при их использовании у меня возникла крайне непонятная ситуация, в которой первые 3 строки проходились и редактировались без проблем, а вот на 4 уже возникала ошибка обращения к памяти почему то, хотя ничего сверхестественного я там не делал.

какая глупость!
короче - весь код выкинуть.
взять TStringList и сделать по-человечески.
Если понадобится - вынести обработку в отдельный тред.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:32 [#16]:

Там смысл втом, чтоб начальные и конечные значения температур изменить на нужные, и внутри через заданное количество слоев програмка должна будет вставить свои строки, чтоб принтер температуру сопла менял на один градус больше.

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

Если я правильно понял то как делают это люди, то там просто пишется скрипт на Pithon и им обрабатывают выходной файл, но я питона не знаю и учить лень, да и на дельфях как то мне кажется проще будет, именно для меня.
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:38 [#17]:

Не там отдельный поток в принципе не нужен, программа тупо обрабатывает один файл, после чего ее закрывают.
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:38 [#18]:

Лучше сделать сразу хорошо.
С блэкджеком и шлюхами.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 28 апреля 2017, 18:40 [#19]:

ну ну ))))
min@y™

min@y™ (статус: Доктор наук), 28 апреля 2017, 18:42 [#20]:

Цитата (SOA):

Не там отдельный поток в принципе не нужен, программа тупо обрабатывает один файл, после чего ее закрывают.

тем более - выкинуть этот шлак и написать прогу за полчаса. в delphi для этого есть всё.

Лет 20 назад я такие вещи ваще на турбопаскале писал, под ДОС.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [1] [2] [Следующая »]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 сентября 2017, 11:40
Выполнено за 0.07 сек.
Рейтинг@Mail.ru