2015-01-07 25 views
0

假設我們有一個格式化爲位置文件指針一審以CSV的值文件

單位,日期,客戶ID,數據1,數據,...,DATA_N,說明

CSV文件較大

單位,日期,客戶ID,數據1,數據,...,DATA_N,說明

,我們定義變量dBegin = '2010-05-01';dEnd = '2011-05-01';(說)。

是否可以將文件指針重新定位到與列2中第一個dBegin實例相對應的行的開始位置?

我正在使用的文件最初是按日期排序的,所以按日期範圍提取子集時,可以節省大量時間,而不是逐行遍歷文件並檢查條目是否落入指定的日期範圍與否。

回答

1

我想每行的長度不是常數,這將使它無法使用fseek將文件指針設置爲行的開頭而不先讀取(這將使makefile設置filepointer無用)。

你在另一個問題中寫道,你的輸入文件很大,速度很重要。在這種情況下,我會建議使用設計用於快速字符串處理的工具來執行預處理(查找開始/結束日期,僅使用這些行)。

我創建的示例輸入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=","}$2~/2011-05-02/{f=1;}; f==1{print $0}; $2~/2011-05-06/{exit}' file.csv 

這返回(I也只會列出需要的列)

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

然後用textread to i輸入這個縮減的集合。

如果你有一個可能50行的具體文本文件,我們可以幫助更好。