Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi 7中扫描CSV文件以获取值的最佳方法_Delphi_Delphi 7 - Fatal编程技术网

在Delphi 7中扫描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)

我正在寻找关于如何最好地使用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,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中执行。