将文件指针定位到 CSV 文件中值的第一个实例

Position File Pointer to First Instance of a Value in a CSV File

假设我们有一个格式为

的大型 CSV 文件

单位、日期、客户 ID、Data_1、Data_2、...、Data_n、描述

单位、日期、客户 ID、Data_1、Data_2、...、Data_n、描述

等等

我们定义变量 dBegin = '2010-05-01';dEnd = '2011-05-01';(比方说)。

是否可以(快速)将文件指针重新定位到与第 2 列中第一个 dBegin 实例对应的行的开头?

我正在使用的文件最初是按日期排序的,因此这将在按日期范围提取子集时节省大量时间,而不是逐行遍历文件并检查条目是否落入是否在指定的日期范围内。

我猜每行的长度不是常量,这将导致无法使用 fseek 将文件指针设置到行的开头而不先读取它(这会使设置文件指针无用)。

你在另一个问题中写道,你的输入文件很大,速度很重要。在这种情况下,我建议使用旨在进行快速字符串处理的工具来进行预处理(查找 start/end 日期,仅使用这些行)。

我创建了一个示例输入 file.csv:

  5,2010-05-01, Customer ID1, DataA
  9,2011-05-02, Customer ID2, DataB
  1,2011-05-04, Customer ID3, DataC
  3,2011-05-06, Customer ID4, DataD
  8,2011-05-08, Customer ID5, DataE

并使用 AWK 对其进行预处理(GNU/Linux 上的标准工具,对于 windoze,请参见 http://gnuwin32.sourceforge.net/packages/gawk.htm):

awk 'BEGIN{FS=","}~/2011-05-02/{f=1;}; f==1{print [=11=]}; ~/2011-05-06/{exit}' file.csv

这个returns(我也只会打印需要的列)

9,2011-05-02, Customer ID2, DataB
1,2011-05-04, Customer ID3, DataC
3,2011-05-06, Customer ID4, DataD

然后使用 textread 导入这个缩减集。

如果您有大约 50 行的具体文本文件,我们可以提供更好的帮助。