2012-12-04 19 views
0

我一次抓取一個值並將其動態加載到網格中。使用CSV分析器選擇值

有沒有辦法索引一個csv文件,只查找某個行和列的值? 我無法讀取所有行,因爲這會破壞動態加載的目的。

在我的情況下,CSV解析器Fast CSV Parser可以獲取像csv[row][column]這樣的值。在查看源代碼時,我注意到它會遍歷文件中的所有內容,直到它到達正確的索引列對。要獲得第100列第80列的值,可能需要相當長的時間。

任何幫助非常感謝。

回答

0

那麼,你可以做一個快速的第一遍,並存儲每一行​​的偏移量。這會使後續定位更快。如果您有80列,但有100K行,我會專注於快速查找行,而不是快速查找列。

ETA:好的,我假設你的CSV文件在磁盤上,並且你可以獨佔訪問它。其中一些代碼基於this

List<int> offsets = new List<int>(); 
    using (StreamReader reader = new StreamReader("myfile.csv")) 
    { 
     int offset = 0; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      offsets.Add(offset);    
      offset += (line.Length + 2); // The 2 is for NewLine(\r\n) 
     } 
     offsets.Add(offset); // pick up the last one 
    } 

在該過程結束,你將有List變量offsets,這是由行號索引,並且包含偏移到每一行。然後,您可以在閱讀文件時(在進行網格構建時)使用offsets[n]來獲取到Seek的偏移量(假設您正在使用FileStream或StreamReader)並使用offsets[n+1] - offsets[n]來獲取長度。至於解析返回的文本行,我假設你正在適應的CSV庫有很好的邏輯。

+0

如果我能夠索引它們,我該怎麼做?那麼我怎麼會告訴我在這個指數的行?每行的字節長度可能相同,因此我說第18行給了我sizeof(row)* 18,然後我該如何說從這個字節開始讀取行? – EvilWeebl

+0

@EvilWeebl我會用一些建議填寫我的答案。 –

+0

看起來很棒!非常感謝,我一定會對此有所作爲。 – EvilWeebl

0

CSV文件不支持索引某個特定行的位置。

我認爲你可以做的最好的事情是閱讀每一行,直到找到你想要的。所以在掃描一行時,平均讀取文件的一半,這比讀取整個文件要好。

如果您使用我在文章Reading and Writing CSV Files in C#中提供的CSV解析器,則可以一次只讀取一行。

另一種選擇是,如果你打算從同一個文件訪問多行。在這種情況下,您可以運行該文件並構建索引列表。但是,如果您要在單個會話中查找多行,這隻會帶來好處。

+0

目前我通過一個抓住實際值一個,因爲我在網格中使用綁定列,並要求時,取的行和列的值,而不是非常有效的,我知道。當它的請求行10列5沒有那麼差時,因爲它只讀取那麼遠,但是如果您在10000行中查找所有6列數據值,這意味着每次需要讀取10000行時,您需要獲得一個值是慢的。 – EvilWeebl