在Delphi 7中扫描CSV文件以获取值的最佳方法
我正在寻找关于如何最好地使用Delphi7处理编程任务的建议 我需要能够从小于15kb的CSV文件中快速识别值。CSV文件的格式为: 章节号、段落号、段落总字数 我希望能够通过提供前两个值(即章节号和段落号)的函数来检索最后一个值,即字数 CSV文件按数字排序,即:在Delphi 7中扫描CSV文件以获取值的最佳方法,delphi,delphi-7,Delphi,Delphi 7,我正在寻找关于如何最好地使用Delphi7处理编程任务的建议 我需要能够从小于15kb的CSV文件中快速识别值。CSV文件的格式为: 章节号、段落号、段落总字数 我希望能够通过提供前两个值(即章节号和段落号)的函数来检索最后一个值,即字数 CSV文件按数字排序,即: 1,1,30 // first paragraph of first chapter (line # 1) 1,2,56 // second paragraph of first chapter (line # 2)
1,1,30 // first paragraph of first chapter (line # 1)
1,2,56 // second paragraph of first chapter (line # 2)
1,3,101
1,4,56
...
2,1,78
2,2,51
...
100,1,87
100,2,101
...
100,23,78 // last paragraph of last chapter (line # 1500)
在上面的例子中,我想把2,2传递给一个函数,让它返回51个整数
我希望避免使用数据库表,因为:1 CSV文件中的数据量没有那么大1500行,即1500段,2数据库引擎的额外开销我只需要读取数据,而不需要写入数据,3从程序中调用此函数的频率
您会推荐什么,为什么?如果文件不是那么大~几KB,我建议将其读取到内存中,并搜索1310'。如果文件中没有多余的空格,这个字符串后面的下一个数字当然是您正在搜索的数字。如果文件不是那么大~几KB,我建议将其读取到内存中,然后搜索1310','。如果文件中没有多余的空格,这个字符串后面的下一个数字当然是您正在搜索的数字。我想我应该创建二维数组
Book[Chapter, Paragraph]
并通过读取文件手动填充
而这个功能将是微不足道的:
GetNumberOfPages(Chapter: integer; Paragraph: integer): integer;
begin
Result := Book[Chapter, Paragraph];
end;
如果你正在寻找第三方的工具,绝地武士可能是一个选择
我想我应该创建二维数组
Book[Chapter, Paragraph]
并通过读取文件手动填充
而这个功能将是微不足道的:
GetNumberOfPages(Chapter: integer; Paragraph: integer): integer;
begin
Result := Book[Chapter, Paragraph];
end;
如果你正在寻找第三方的工具,绝地武士可能是一个选择
ParseFile解析文件并以二维动态数组返回它。如果您100%确定没有超出阵列的边界,则可以直接访问它。否则,GetValue函数是访问数组内容的安全包装器
将其用作:
USES ... StrUtils ...;
.
.<My Code>
.
VAR ARR : TTwoDimIntArr;
BEGIN
ARR:=ParseFile(<FileName>);
.
.
.
Words:=GetValue(ARR, <Chapter>, <Paragraph>);
.
.
END.
ParseFile解析文件并以二维动态数组返回它。如果您100%确定没有超出阵列的边界,则可以直接访问它。否则,GetValue函数是访问数组内容的安全包装器
将其用作:
USES ... StrUtils ...;
.
.<My Code>
.
VAR ARR : TTwoDimIntArr;
BEGIN
ARR:=ParseFile(<FileName>);
.
.
.
Words:=GetValue(ARR, <Chapter>, <Paragraph>);
.
.
END.
与其编写自己的代码,为什么不使用TStrings的CommaText属性呢 下面显示了使用CommaText的示例。 代码 将显示报价单:a b c,d 作为三个ShowMessage调用的输出 安德鲁
英国汉普郡与其编写自己的代码,为什么不使用TStrings的CommaText属性呢 下面显示了使用CommaText的示例。 代码 将显示报价单:a b c,d 作为三个ShowMessage调用的输出 安德鲁
英国汉普郡对于2dim阵列,您需要一个stringlist助手作为临时:
BEGIN
SL:=TStringList.Create;
sltemp:= TStringList.Create;
TRY
SL.LoadFromFile(FileName);
writeln('Scikit Boston Samples: '+itoa(sl.count-1))
FOR I:= 0 TO SL.Count-1 DO BEGIN
S:=SL[(I)];
SLtemp.CommaText:= S;
for sll:= start-1 to col-1 do
SetValue(Result,I,Sll,StrToFloat(sltemp[sll]))
END;
FINALLY
sltemp.free;
SL.Free
END
对于2dim阵列,您需要一个stringlist帮助程序作为临时:
BEGIN
SL:=TStringList.Create;
sltemp:= TStringList.Create;
TRY
SL.LoadFromFile(FileName);
writeln('Scikit Boston Samples: '+itoa(sl.count-1))
FOR I:= 0 TO SL.Count-1 DO BEGIN
S:=SL[(I)];
SLtemp.CommaText:= S;
for sll:= start-1 to col-1 do
SetValue(Result,I,Sll,StrToFloat(sltemp[sll]))
END;
FINALLY
sltemp.free;
SL.Free
END
你是说使用LoadFromFile将整个文件加载到单个字符串中,然后执行Pos1310+'2,2,字符串?是的,类似的。你是说使用LoadFromFile将整个文件加载到单个字符串中,然后执行Pos1310+'2,2,字符串?是的,类似的东西。您可以使用初始加载的AdoDataset或Clientdataset,将CreateDataset作为MemoryTable,并使用Locate获取值。您还可以构建一个二叉树或一个记录数组或一个自己的类列表,并对它们进行二叉搜索。根据您的关注点,您可以选择最容易实现的解决方案或fastet解决方案。您可以使用初始加载的AdoDataset或Clientdataset,将CreateDataset作为MemoryTable,并使用Locate获取值。您还可以构建一个二叉树或一个记录数组或一个自己的类列表,并对它们进行二叉搜索。根据您的关注点,您可以选择最容易实现的解决方案或fastet解决方案。不过,Delphi 7具有PosEx功能,Delphi 7不知道如何处理SL中的FOR S DO BEGIN IN the ParseFile函数。我已经更新了代码,向不熟悉FOR…语法的任何人展示了如何在Delphi 7中执行。Delphi 7确实有PosEx函数,Delphi 7不知道如何在ParseFile函数中处理SL DO BEGIN中的FOR S。我已经更新了代码,向不熟悉FOR…语法的任何人展示了如何在Delphi 7中执行。