Files
dyp/backup_ansi/uFile3Json.pas
T
2026-05-07 20:25:34 +08:00

282 lines
6.7 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
unit uFile3Json;
interface
uses
System.Classes, System.SysUtils, System.JSON, System.RegularExpressions, StrUtils;
type
TWaterData = record
DataValue: Integer;
Status: string;
ID: string;
HasData: Boolean;
end;
TFileMonitor = class
private
FInWaterData: TWaterData;
FOutWaterData: TWaterData;
FDebugInfo: TStringList;
function ExtractID(const Line: string): string;
function ExtractStatus(const Line: string): string;
function ExtractData(const Line: string): string;
function ExtractLastValue(const DataStr: string): Integer;
procedure AddDebugInfo(const Info: string);
public
constructor Create;
destructor Destroy; override;
function ProcessFileContent(const Content: TStringList): string;
property DebugInfo: TStringList read FDebugInfo;
end;
implementation
constructor TFileMonitor.Create;
begin
inherited;
FDebugInfo := TStringList.Create;
FInWaterData.HasData := False;
FOutWaterData.HasData := False;
end;
destructor TFileMonitor.Destroy;
begin
FDebugInfo.Free;
inherited;
end;
procedure TFileMonitor.AddDebugInfo(const Info: string);
begin
FDebugInfo.Add(Info);
end;
function TFileMonitor.ExtractID(const Line: string): string;
var
StartPos, EndPos: Integer;
begin
Result := '';
StartPos := Pos('ID', Line);
if StartPos > 0 then
begin
EndPos := PosEx(',', Line, StartPos);
if EndPos > StartPos then
Result := Copy(Line, StartPos + 3, EndPos - StartPos - 3)
else
Result := Copy(Line, StartPos + 3, MaxInt);
AddDebugInfo('提取ID: ' + Result);
end
else
begin
AddDebugInfo('未找到ID');
end;
end;
function TFileMonitor.ExtractStatus(const Line: string): string;
var
StartPos, EndPos: Integer;
begin
Result := '';
StartPos := Pos('卡关:', Line);
if StartPos > 0 then
begin
StartPos := StartPos + 3;
EndPos := Length(Line);
Result := Copy(Line, StartPos, EndPos - StartPos + 1);
Result := Trim(Result);
AddDebugInfo('提取状态: ' + Result);
end
else
begin
AddDebugInfo('未找到状态');
end;
end;
function TFileMonitor.ExtractData(const Line: string): string;
var
StartPos, EndPos: Integer;
begin
Result := '';
StartPos := Pos('[', Line);
EndPos := Pos(']', Line);
if (StartPos > 0) and (EndPos > StartPos) then
begin
Result := Copy(Line, StartPos + 1, EndPos - StartPos - 1);
AddDebugInfo('提取数据: ' + Result);
end
else
begin
AddDebugInfo('未找到数据');
end;
end;
function TFileMonitor.ExtractLastValue(const DataStr: string): Integer;
var
Values: TStringList;
LastValue: string;
I: Integer;
begin
Result := 0;
Values := TStringList.Create;
try
Values.Delimiter := ',';
Values.StrictDelimiter := True;
Values.DelimitedText := DataStr;
AddDebugInfo('数据分割结果: ' + IntToStr(Values.Count) + ' 个值');
// 从后往前找第一个有效的数值
for I := Values.Count - 1 downto 0 do
begin
LastValue := Trim(Values[I]);
AddDebugInfo('检查值: ' + LastValue);
if TryStrToInt(LastValue, Result) then
begin
AddDebugInfo('找到有效值: ' + IntToStr(Result));
Exit;
end;
end;
AddDebugInfo('未找到有效数值');
finally
Values.Free;
end;
end;
function TFileMonitor.ProcessFileContent(const Content: TStringList): string;
var
I: Integer;
Line, CurrentID, Status, DataStr: string;
LastValue: Integer;
LastID: string;
RootObj: TJSONObject;
InWaterDataArray, OutWaterDataArray: TJSONArray;
HasInWater, HasOutWater: Boolean;
begin
AddDebugInfo('开始处理文件内容');
// 初始化
LastID := '';
FInWaterData.HasData := False;
FOutWaterData.HasData := False;
HasInWater := False;
HasOutWater := False;
// 处理每一行
for I := 0 to Content.Count - 1 do
begin
Line := Content[I];
AddDebugInfo('处理行 ' + IntToStr(I) + ': ' + Line);
CurrentID := ExtractID(Line);
// 如果ID为空,跳过
if CurrentID = '' then
Continue;
// 记录最后一个ID
LastID := CurrentID;
Status := ExtractStatus(Line);
// 检查是否是入水距离值
if (Pos('入水距离值', Line) > 0) then
begin
AddDebugInfo('找到入水距离值');
DataStr := ExtractData(Line);
if DataStr <> '' then
begin
LastValue := ExtractLastValue(DataStr);
// 只保留状态为"合格"的数据
// if Status = '合格' then
begin
AddDebugInfo('入水距离状态合格,记录数据');
FInWaterData.DataValue := LastValue;
FInWaterData.Status := Status;
FInWaterData.ID := CurrentID;
FInWaterData.HasData := True;
HasInWater := True;
end
// else
// begin
// AddDebugInfo('入水距离状态不合格: ' + Status);
// end;
end;
end
// 检查是否是出水距离值
else if (Pos('出水距离值', Line) > 0) then
begin
AddDebugInfo('找到出水距离值');
DataStr := ExtractData(Line);
if DataStr <> '' then
begin
LastValue := ExtractLastValue(DataStr);
// 只保留状态为"合格"的数据
// if Status = '合格' then
begin
AddDebugInfo('出水距离状态合格,记录数据');
FOutWaterData.DataValue := LastValue;
FOutWaterData.Status := Status;
FOutWaterData.ID := CurrentID;
FOutWaterData.HasData := True;
HasOutWater := True;
end
// else
// begin
// AddDebugInfo('出水距离状态不合格: ' + Status);
// end;
end;
end;
end;
AddDebugInfo('处理完成,最后ID: ' + LastID);
AddDebugInfo('入水数据有效: ' + BoolToStr(HasInWater, True));
AddDebugInfo('出水数据有效: ' + BoolToStr(HasOutWater, True));
RootObj := TJSONObject.Create;
try
// 添加合并ID(如果需要)
if FInWaterData.ID<>'' then
RootObj.AddPair('ID', FInWaterData.ID) // 或者根据需求选择
else
RootObj.AddPair('ID', FOutWaterData.ID); // 或者根据需求选择
// 添加入水数据
if HasInWater then
begin
RootObj.AddPair('距离', TJSONNumber.Create(FInWaterData.DataValue));
// RootObj.AddPair('入水ID', FInWaterData.ID);
RootObj.AddPair('入水卡关状态', FInWaterData.Status);
AddDebugInfo('添加入水数据: ' + IntToStr(FInWaterData.DataValue));
end
else
begin
AddDebugInfo('无有效入水数据');
end;
// 添加出水数据
if HasOutWater then
begin
RootObj.AddPair('出水距离', TJSONNumber.Create(FOutWaterData.DataValue));
// RootObj.AddPair('出水ID', FOutWaterData.ID);
RootObj.AddPair('卡关', FOutWaterData.Status);
AddDebugInfo('添加出水数据: ' + IntToStr(FOutWaterData.DataValue));
end
else
begin
AddDebugInfo('无有效出水数据');
end;
Result := RootObj.ToString;
AddDebugInfo('最终结果: ' + Result);
finally
RootObj.Free;
end;
end;
end.