2016-01-13 78 views
0

我有一行值作爲CSV文件, 我需要找到它們中的每一個是否存在於另一個文件(XML)中。C#在文件中查找CSV數據

我已閱讀CSV數據,拆分值和搜索代碼工作但輸出一個錯誤的結果(「找到」值不存在) 我會胃口任何幫助。 感謝煞筆

我的代碼

string csvFile = @"Afile.csv"; 
string[] lines = System.IO.File.ReadAllLines(csvFile); 
string namesValues = lines[0]; 

List<string> allValidNamesValues = namesValues.Split(',').ToList(); 

bool result = false; 

string DeviceName = Phone.Tag("Name").Value(); 

if (allValidNamesValues.Any(vn => DeviceName.IndexOf(vn, StringComparison.OrdinalIgnoreCase) != -1)) 
{ 
    Info = string.Format("The Device is supported"); 
    return true; 
} 

return result; 
+0

庫,你可以給線和值是有問題的例子?它可以像顛倒vn.IndexOf(設備名稱)',例如。注意:在一般情況下,'.Split(',')'不是**正確的CSV處理實現,因爲CSV實際上比這更復雜。不過,在某些情況下,您可能會忽略它。 –

+0

另請注意:您只查看文件的第一行(但所有「列」,其中「列」是對「按逗號分割」的鬆散且不可靠的解釋);那是故意的嗎? –

回答

0

我建議你真的想這樣的事情:的CSV

    1. 測試1 跳過CSV標題(1號線)

    該工具antation

    string DeviceName = Phone.Tag("Name").Value(); 
    string csvFile = @"Afile.csv"; 
    
    var result = File 
        .ReadLines(csvFile) // You have no need to read all the lines 
        .Skip(1) // skip title, comment out this if CSV has no caption 
        .Select(line => line.Split(',')) // providing that CSV doen't have quotations 
        .Select(items => items[0]) // providing that 1ast column contains names 
        .Any(name => String.Equals(name, DeviceName, StringComparison.OrdinalIgnoreCase)); 
    
  • 0

    我猜這裏的主要問題是,你只處理文件(lines[0])的第一線。您可以使用嵌套循環來處理所有行,或者使用SelectMany(LINQ)。例如(使用ReadLines以避免需要緩衝所有的數據在一次):

    static readonly char[] comma = { ',' }; 
    ... 
    if(File.ReadLines(csvFile).SelectMany(x => x.Split(comma)).Any(
         vn => DeviceName.IndexOf(vn, StringComparison.OrdinalIgnoreCase) != -1)) 
    { 
        // whatever 
    } 
    

    請注意,我不相信串測試是正確的(對我來說,似乎更爲明顯有vn.IndexOf(DeviceName, ...),但是:很難檢查,沒有例子

    做一個更正確解析CSV是比較複雜的,你應該考慮像LumenWorksCsvReader

    +0

    我只處理第一行,因爲只有一行數據。 –

    +0

    @ShabiLevanda看到了,這就是你應該在問題中包含的那種細節......我們可以看到的樣本數據的任何更新,你認爲應該通過/失敗,但沒有? –