我一次抓取一個值並將其動態加載到網格中。使用CSV分析器選擇值
有沒有辦法索引一個csv文件,只查找某個行和列的值? 我無法讀取所有行,因爲這會破壞動態加載的目的。
在我的情況下,CSV解析器Fast CSV Parser可以獲取像csv[row][column]
這樣的值。在查看源代碼時,我注意到它會遍歷文件中的所有內容,直到它到達正確的索引列對。要獲得第100列第80列的值,可能需要相當長的時間。
任何幫助非常感謝。
我一次抓取一個值並將其動態加載到網格中。使用CSV分析器選擇值
有沒有辦法索引一個csv文件,只查找某個行和列的值? 我無法讀取所有行,因爲這會破壞動態加載的目的。
在我的情況下,CSV解析器Fast CSV Parser可以獲取像csv[row][column]
這樣的值。在查看源代碼時,我注意到它會遍歷文件中的所有內容,直到它到達正確的索引列對。要獲得第100列第80列的值,可能需要相當長的時間。
任何幫助非常感謝。
那麼,你可以做一個快速的第一遍,並存儲每一行的偏移量。這會使後續定位更快。如果您有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庫有很好的邏輯。
CSV文件不支持索引某個特定行的位置。
我認爲你可以做的最好的事情是閱讀每一行,直到找到你想要的。所以在掃描一行時,平均讀取文件的一半,這比讀取整個文件要好。
如果您使用我在文章Reading and Writing CSV Files in C#中提供的CSV解析器,則可以一次只讀取一行。
另一種選擇是,如果你打算從同一個文件訪問多行。在這種情況下,您可以運行該文件並構建索引列表。但是,如果您要在單個會話中查找多行,這隻會帶來好處。
目前我通過一個抓住實際值一個,因爲我在網格中使用綁定列,並要求時,取的行和列的值,而不是非常有效的,我知道。當它的請求行10列5沒有那麼差時,因爲它只讀取那麼遠,但是如果您在10000行中查找所有6列數據值,這意味着每次需要讀取10000行時,您需要獲得一個值是慢的。 – EvilWeebl
如果你被允許使用第三方庫,我會看看其中的一些。 MySQL具有CSV引擎支持,因此您可以使用它們的庫來執行此操作。
然而,C#並不提供處理CSV文件的好方法。
http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html
如果我能夠索引它們,我該怎麼做?那麼我怎麼會告訴我在這個指數的行?每行的字節長度可能相同,因此我說第18行給了我sizeof(row)* 18,然後我該如何說從這個字節開始讀取行? – EvilWeebl
@EvilWeebl我會用一些建議填寫我的答案。 –
看起來很棒!非常感謝,我一定會對此有所作爲。 – EvilWeebl