将文件指针定位到 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 行的具体文本文件,我们可以提供更好的帮助。
假设我们有一个格式为
的大型 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 行的具体文本文件,我们可以提供更好的帮助。