2016-06-15 109 views
1

比較快的方式搜索字符串中的一個大的CSV文件C#

  • 一個DataTable(列ACCID和TerrName),其中包含超過2000行。
  • 包含超過6百萬條記錄的大型csv文件(列爲AccId和External_ID)。

現在,我需要匹配AccId並且必須從csv文件中找到其對應的External_ID。

目前我使用下面的代碼實現它:

DataTable tblATL = Util.GetTable("ATL", false); 
tblATL.Columns.Add("External_ID"); 

DataTable tbl = Util.CsvToTable("TT.csv", true); 

foreach (DataRow columnRow in tblATL.Rows) 
{ 
    var query = tbl.Rows.Cast<DataRow>().FirstOrDefault(x => x.Field<string>("AccId") == columnRow["AccId"].ToString()); 
    if (query != null) 
    { 
     columnRow["External_ID"] = query.Field<string>("External_ID"); 
    } 
    else 
    { 
     columnRow["External_ID"] = "New"; 
    } 
} 

此代碼工作很好,但唯一的問題是性能問題,其採取非常非常長的時間才能得到結果。

請幫忙。我該如何改進其性能,您有其他方法嗎?

+0

你能舉出csv文件的示例頭文件嗎?例如字段名稱,它們的順序/類型等(在內存中保存6M記錄將總是較慢) – BugFinder

+0

如果將整個csv文件加載到內存中,PLinq始終是一個選項。 – Sidewinder94

+0

@BugFinder:所有列都是沒有特定順序的字符串類型。 AccId,External_ID 001P000000eHknBIAS,303363IN 001U000001bU0Q6IAK,303063IN – Avijit

回答

3

我建議組織數據到一個字典,比如說,Dictionary<String, String[]>它有O(1)時間複雜度,例如,

Dictionary<String, String[]> Externals = File 
    .ReadLines(@"C:\MyFile.csv") 
    .Select(line => line.Split(',')) // the simplest, just to show the idea 
    .ToDictionary(
     items => items[0], // let External_ID be the 1st column 
     items => items // or whatever record representation 
    ); 

    .... 

    String externalId = ... 

    String[] items = Externals[externalId]; 

編輯:如果同一External_ID可以出現不止一次(見下面的註釋),你必須處理重複,例如

var csv = File 
    .ReadLines(@"C:\MyFile.csv") 
    .Select(line => line.Split(',')) // the simplest, just to show the idea 

Dictionary<String, String[]> Externals = new Dictionary<String, String[]>(); 

foreach (var items in csv) { 
    var key = items[0]; // let External_ID be the 1st column 
    var value = items; // or whatever record representation 

    if (!Externals.ContainsKey(key)) 
    Externals.Add(key, value); 
    // else { 
    // //TODO: implement, if you want to deal with duplicates in some other way 
    //} 
} 
+0

讓我來實現它。 – Avijit

+0

目前我面臨着數據問題,文件可能包含重複的AccId與不同的External_Id,需要考慮它的第一個出現。字典像預期的那樣引發重複鍵的異常。 – Avijit

+0

@Avijit:在這種情況下,你必須處理重複(參見我的編輯),最簡單的'ToDictionary()'不會。 –

相關問題