我的任务是从旧软件的数据文件中提取数据 - CIMplicity HMI Plant Edition 6.0版.它是2002年的SCADA软件.我有一份数据文件目录,里面包含很多*.DAT和*.IDX文件.我需要将此数据提取到CSV或SQL数据库.一些DAT文件只是纯文本,但其他文件具有类似二进制的格式,在PSPad中打开时,以HEX视图模式显示.
我可以使用哪些工具可靠地从这些文件中读取和提取数据?
TIA.
更新:我已经添加了包含数据文件的目录的目录列表:
Directory of C:\tmp\xxxxxxII\data
04/30/2013 01:53 PM <DIR> .
04/30/2013 01:53 PM <DIR> ..
09/02/2008 10:46 AM 17,260 1220323606.clz
09/02/2008 10:46 AM 60,490 1220323607.clz
09/10/2008 06:36 PM 288,554 1220323608.clz
09/02/2008 10:46 AM 66,977 1220323609.clz
09/10/2008 06:37 PM 23,900 1220323610.clz
09/10/2008 06:37 PM 19,162 1220323611.clz
09/10/2008 06:48 PM 37,596 1220323612.clz
09/10/2008 06:49 PM 27,882 1220323613.clz
09/10/2008 06:49 PM 47,850 1220323614.clz
09/10/2008 06:50 PM 47,816 1220323615.clz
09/10/2008 06:52 PM 3,427,511 1220323616.clz
09/02/2008 10:46 …Run Code Online (Sandbox Code Playgroud) 使用:Delphi XE2,Windows VCL表单应用程序,32位
我正在使用SynEdit控件来显示文本.我已经在控件中使用TSynHTMLSyn语法高亮显示器来正确地突出显示HTML和JS代码.
我也正在对这个文本(使用Angus Johnson的TDiff)和另一个版本的文本进行差异查找:删除,添加和更改.我需要使用不同的颜色突出显示每种类型的更改,即RED表示删除,BLUE表示添加,GREEN表示更改.
我的问题:
TIA.
我需要从命令行运行sqlite backup命令.我不想使用"cmd/c".命令是:
sqlite3.exe MYDB.db .dump> MYDB.bak
我在SO上找不到任何显示如何执行此操作的示例.
到目前为止,从各种SO帖子收集的代码是这样的,但是非常不完整:
function StartProcess(const ACommandLine: string; AShowWindow: boolean = True;
AWaitForFinish: boolean = False): Integer;
var
CommandLine: string;
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
Handle: boolean;
begin
Result := 0;
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
FillChar(ProcessInformation, SizeOf(TProcessInformation), 0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
StartupInfo.hStdOutput := StdOutPipeWrite;
StartupInfo.hStdError := StdOutPipeWrite;
if not(AShowWindow) then
begin
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
end;
CommandLine := ACommandLine;
UniqueString(CommandLine);
Handle := CreateProcess(nil, PChar(CommandLine), nil, nil, False,
CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, …Run Code Online (Sandbox Code Playgroud) 我正在使用TVirtualStringTree来存储指向记录的指针.
最初有一个包含记录列表的TList.
我正在使用OnInitNode事件迭代TList并将每个记录的数据分配给树的节点.
但是,在检索与OnNewText事件处理程序中的节点关联的数据时,返回的指针具有与最初存储在树中的指针不同的地址.
此外,我可以通过调试从节点中检索到的指针(该记录的数据)是看不一样最初存储在该节点的一个.我需要将更改的数据保存到数据库,并需要使用更改的数据引用记录.引用指针应该很简单,但问题是指针不一样.
我不确定我做错了什么,希望有人可以帮我解决这个问题.
提前致谢.
这是我的代码:
数据结构和声明:
TTherapData = record
TherapID: Integer;
TherapName: String[120];
TherapInstr: String[120];
Selected_DB: Byte;
Selected: Byte;
end;
PTherapData = ^TTherapData;
FTherapDataList: TList<PTherapData>;
FTherapDataListAsg_Iter: Integer;
vstRxList_Asg: TVirtualStringTree;
Run Code Online (Sandbox Code Playgroud)
将数据加载到TList中,然后加载到树中:
procedure TfmPatient_Conslt.LoadTherapList(const ADBLoad: Boolean = False);
var
TherapData: PTherapData;
d, x: Integer;
begin
datamod.uspLKTHERAP_S.First;
while not datamod.uspLKTHERAP_S.Eof do
begin
New(TherapData);
TherapData^.TherapID := datamod.uspLKTHERAP_SROW_ID.AsInteger;
TherapData^.TherapName := datamod.uspLKTHERAP_SIMPRTHERAP.AsString;
TherapData^.TherapInstr := EmptyStr;
TherapData^.Selected := 0;
TherapData^.Selected_DB := 0;
FTherapDataList.Add(TherapData);
datamod.uspLKTHERAP_S.Next;
end;
datamod.uspCONSLT_RX_S.First;
while not datamod.uspCONSLT_RX_S.Eof do
begin
d …Run Code Online (Sandbox Code Playgroud) 我正在 PHP 中加密文本(openssl_encrypt / 'aes-256-cbc'),然后尝试在 Delphi 7 中解密(DCPCrypt / TDCP_rijndael)。
PHP脚本文件以ANSI编码保存,希望传输的字符串(它是REST API Web服务)与Delphi兼容。
然而,Delphi 解密产生了错误的结果,我猜测代码中有问题。如果您能看一下并发现我在 Delphi 方面的错误,我将不胜感激:
PHP代码:
function encrypt($key, $payload) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
function decrypt($key, $garble) {
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
Run Code Online (Sandbox Code Playgroud)
德尔福代码:
var
DCP_rijndael: TDCP_rijndael;
const
cPASSWORD = 'myownpassword';
function Decrypt(AStr: string): string;
var
d, s, iv: String;
p: Integer;
begin
d := Base64DecodeStr(AStr);
p …Run Code Online (Sandbox Code Playgroud) 使用:Delphi XE2
类具有另一个类的字段.
在该字段的过程中是否可以引用容器类?
Type TClassA = class
procedure ClassAMethod;
end;
Type TClassB = class
ClassA : TClassA;
end;
procedure TClassA.ClassAMethod;
begin
// is it possible to get a reference to the
// owning ClassB object here?
end;
Run Code Online (Sandbox Code Playgroud) 我使用以下正则表达式扫描输入文本文件以获取有效的电子邮件.
[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?
Run Code Online (Sandbox Code Playgroud)
现在我还需要在电子邮件地址中的"@"符号前将匹配限制为20个字符,但不知道如何操作.
PS.我正在使用Delphi XE2中的Perl正则表达式库(TPerlRegex).
你能帮帮我吗?
使用:Delphi XE2,来自SVN的最新Indy快照(10.6.0.4997)
在IMAP的情况下,有2个属性--UID和MsgID,可用于唯一标识邮箱中的邮件.
我正在编写一个电子邮件客户端,并且需要知道每次客户端连接和检索消息列表时哪个更可靠或建议存储.
检查新电子邮件需要哪些步骤?我特意寻找正确的序列和一组Indy IdIMAP4命令来获取新的电子邮件.
TIA.
使用:Delphi XE2,Windows VCL Forms应用程序
TThread在执行期间是否可以更改主VCL线程中变量的值?
需要更新一个被声明为TForm类的字段的Integer.它将作为重载(并重新引入)Create构造函数方法中的var变量传递给TThread.
这有什么后盾吗?
我正在Delphi中的代码中创建一个TClientDataSet和TDataSetProvider,并从TUniQuery(Devart UniDAC)加载数据.在设置数据集提供程序和clientdataset的属性后,我尝试打开clientdataset并获取运行时异常:"缺少数据提供程序或数据包".
我不确定为什么会这样,如果有人能指出究竟是什么问题,我会很高兴.
这是我的代码:
//uq is a TUniQuery correctly set to an active TUniConnection
cdsFirstNames := TClientDataSet.Create(nil);
dspFirstNames := TDataSetProvider.Create(nil);
try
uq.SQL.Text := 'SELECT * FROM firstnames;';
uq.Prepared := True;
// uq.Open;
dspFirstNames.Name := 'dspFirstNames';
dspFirstNames.DataSet := uq;
cdsFirstNames.ProviderName := 'dspFirstNames';
cdsFirstNames.Open; // <--- Exception occurs here!
uq.Close;
showmessage(IntToStr(cdsFirstNames.RecordCount));
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 Delphi 程序,该程序需要与存储在属于另一个程序的 SQLite 数据库中的数据进行交互。到目前为止一切正常,除了我无法从 SQLite 数据库的列中的数据存储中获取数据类型为“datetime”的日期/时间值。
我确实知道字段的数据类型在 SQLite 中是不相关的,并且所有内容都存储为字符串,也许这就是我发现自己陷入这种困境的原因。
下面是存储在 SQLite 数据库中的几行数据(第 3 列)与读取和写入此 SQLite 数据库的程序(第 2 列)中显示的相应日期值的示例:
1 11/7/1971 621939168000000000
2 3/17/1976 623314656000000000
3 5/4/1996 629667648000000000
4 9/21/2007 633259296000000000
5 11/17/1972 622264032000000000
6 2/7/1996 629592480000000000
7 6/13/2000 630964512000000000
Run Code Online (Sandbox Code Playgroud)
我的要求:当我从 Delphi 程序中读取第 3 列中的值后,如何将其转换为与第 2 列中显示的相同日期/时间值?我尝试过 UnixToDateTime 函数,但它不会产生相同的值(如第 2 列)。有人可以帮忙吗?
提前致谢!
我已经实现了Generics.Defaults.TComparer来排序类型化的TList.但是,在调用Sort方法时,它会抛出异常"Stack overflow at ..."
为什么发生堆栈溢出错误?
// Declarations
TOrder = record
ID: Integer;
OrderDate: TDate;
end;
POrder = ^TOrder;
FOrderList: TList<POrder>;
TComparer_OrderDate = class(TComparer<POrder>)
public
function Compare(const a, b: POrder): Integer; override;
end;
function TComparer_OrderDate.Compare(const a, b: POrder): Integer;
begin
Result := 0;
if (a^.OrderDate> b^.OrderDate) then
Result := 1
else
Result := -1;
end;
// This code inside a button OnClick event:
FOrderList := TList<POrder>.Create;
FComparer_OrderDate := TComparer_OrderDate.Create;
FOrderList.Sort(FComparer_OrderDate); // <--- 'stack overflow' error.
Run Code Online (Sandbox Code Playgroud) delphi ×10
delphi-7 ×1
delphi-xe2 ×1
encryption ×1
imap ×1
indy ×1
parsing ×1
perl ×1
php-openssl ×1
regex ×1
scada ×1
synedit ×1
tlist ×1
tthread ×1
winapi ×1