343 lines
8.6 KiB
ObjectPascal
343 lines
8.6 KiB
ObjectPascal
unit uFile3Json;
|
||
|
||
interface
|
||
|
||
uses
|
||
System.Classes, System.SysUtils, System.JSON, System.RegularExpressions, StrUtils;
|
||
|
||
type
|
||
TWaterData = record
|
||
DataValue: Integer;
|
||
Status: string;
|
||
ID: string;
|
||
Sn: string;
|
||
HasData: Boolean;
|
||
end;
|
||
|
||
TFileMonitor = class
|
||
private
|
||
FInWaterData: TWaterData;
|
||
FOutWaterData: TWaterData;
|
||
FDebugInfo: TStringList;
|
||
function ExtractID(const Line: string): string;
|
||
function ExtractSn(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.ExtractSn(const Line: string): string;
|
||
var
|
||
StartPos, EndPos: Integer;
|
||
begin
|
||
Result := '';
|
||
StartPos := Pos('SN码:', 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('提取SN码: ' + Result);
|
||
end
|
||
else
|
||
begin
|
||
AddDebugInfo('未找到SN码');
|
||
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
|
||
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);
|
||
|
||
try
|
||
if TryStrToInt(LastValue, Result) then
|
||
begin
|
||
AddDebugInfo('找到有效值: ' + IntToStr(Result));
|
||
Exit;
|
||
end;
|
||
except
|
||
on E: Exception do
|
||
begin
|
||
AddDebugInfo('转换数值时发生异常: ' + E.Message);
|
||
Result := 0;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
AddDebugInfo('未找到有效数值');
|
||
except
|
||
on E: Exception do
|
||
begin
|
||
AddDebugInfo('处理数据值时发生异常: ' + E.Message);
|
||
Result := 0;
|
||
end;
|
||
end;
|
||
finally
|
||
Values.Free;
|
||
end;
|
||
end;
|
||
|
||
function TFileMonitor.ProcessFileContent(const Content: TStringList): string;
|
||
var
|
||
I: Integer;
|
||
Line, CurrentID, Status, DataStr, CurrentSn: string;
|
||
LastValue: Integer;
|
||
LastID, LastSn: string;
|
||
RootObj: TJSONObject;
|
||
InWaterDataArray, OutWaterDataArray: TJSONArray;
|
||
HasInWater, HasOutWater: Boolean;
|
||
begin
|
||
|
||
AddDebugInfo('开始处理文件内容');
|
||
|
||
if Content = nil then
|
||
begin
|
||
AddDebugInfo('错误:Content为nil');
|
||
Result := '{}';
|
||
Exit;
|
||
end;
|
||
|
||
AddDebugInfo('文件行数: ' + IntToStr(Content.Count));
|
||
|
||
// 初始化
|
||
LastID := '';
|
||
LastSn := '';
|
||
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);
|
||
CurrentSn := ExtractSn(Line);
|
||
|
||
// 如果ID为空,跳过
|
||
if CurrentID = '' then
|
||
Continue;
|
||
|
||
// 记录最后一个ID
|
||
LastID := CurrentID;
|
||
LastSn := CurrentSn;
|
||
|
||
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.Sn := CurrentSn;
|
||
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.Sn := CurrentSn;
|
||
FOutWaterData.HasData := True;
|
||
HasOutWater := True;
|
||
end
|
||
// else
|
||
// begin
|
||
// AddDebugInfo('出水距离状态不合格: ' + Status);
|
||
// end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
AddDebugInfo(Format('处理完成,最后ID%s,Sn%s: ' , [LastID,LastSn]));
|
||
AddDebugInfo('入水数据有效: ' + BoolToStr(HasInWater, True));
|
||
AddDebugInfo('出水数据有效: ' + BoolToStr(HasOutWater, True));
|
||
|
||
RootObj := TJSONObject.Create;
|
||
try
|
||
// 添加合并ID(如果需要)
|
||
if FInWaterData.ID<>'' then
|
||
begin
|
||
RootObj.AddPair('SN码', FInWaterData.Sn.Replace(':','').Replace(':','').Replace(';','')); // 或者根据需求选择
|
||
RootObj.AddPair('ID', FInWaterData.ID); // 或者根据需求选择
|
||
end
|
||
else
|
||
begin
|
||
RootObj.AddPair('SN码', FOutWaterData.Sn.Replace(':','').Replace(':','').Replace(';','')); // 或者根据需求选择
|
||
RootObj.AddPair('ID', FOutWaterData.ID); // 或者根据需求选择
|
||
end;
|
||
|
||
// 添加入水数据
|
||
if HasInWater then
|
||
begin
|
||
RootObj.AddPair('距离', TJSONNumber.Create(FInWaterData.DataValue));
|
||
// RootObj.AddPair('入水SN码', FInWaterData.Sn);
|
||
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('出水SN码', FOutWaterData.Sn);
|
||
RootObj.AddPair('卡关', FOutWaterData.Status);
|
||
AddDebugInfo('添加出水数据: ' + IntToStr(FOutWaterData.DataValue));
|
||
end
|
||
else
|
||
begin
|
||
AddDebugInfo('无有效出水数据');
|
||
end;
|
||
|
||
Result := RootObj.ToString;
|
||
AddDebugInfo('最终结果: ' + Result);
|
||
finally
|
||
RootObj.Free;
|
||
end;
|
||
end;
|
||
|
||
end.
|