2011-06-06 30 views
2

我有一個CSV文件,我正在使用緩衝流逐字節讀取數據。如果最後的column = "True",我想忽略閱讀該行。我如何實現它?如何檢查csv文件中的最後一列行是否爲緩衝讀取器中的「真」

到目前爲止我有:

BufferedStream stream = new BufferedStream(csvFile, 1000); 
int byteIn = stream.ReadByte(); 

while (byteIn != -1 && (char)byteIn != '\n' && (char)byteIn != '\r') 
    byteIn = stream.ReadByte(); 

我想忽略讀取行,如果該行的最後一列是「真」

+2

什麼是你的代碼看起來像那麼遠?你現在怎麼讀行? – JYelton 2011-06-06 16:54:21

+0

用上面的代碼編輯 – InfoLearner 2011-06-06 16:58:23

+0

文件有多大?每條線有多長時間? – 2011-06-06 17:02:20

回答

0

我會讀/導入整個CSV文件轉換爲DataTable對象,然後在數據表上執行Select以包含最後一列不等於true的行。

0

除了jkirkwood的回答,您還可以讀取每一行並有條件地將一個類或結構添加到對象列表中。

一些快速,半僞代碼:

List<MyObject> ObjectList = new List<MyObject>(); 
struct MyObject 
{ 
    int Property1; 
    string Property2; 
    bool Property3; 
} 

while (buffer = StreamReader.ReadLine()) 
{ 
    string[] LineData = buffer.Split(','); 
    if (LineData[LineData.Length - 1] == "true") continue; 
    MyObject CurrentObject = new MyObject(); 
    CurrentObject.Property1 = Convert.ToInt32(LineData[1]); 
    CurrentObject.Property2 = LineData[2]; 
    CurrentObject.Property3 = Convert.ToBoolean(LineData[LineData.Length - 1]); 
    ObjectList.Add(CurrentObject); 
} 

它真的有種取決於你想要的數據做一旦你讀它是什麼。

希望這個例子有點幫助。

編輯

正如在評論中指出,請注意,這只是一個簡單的例子。你的CSV文件可能有限定符和其他的東西,使字符串分裂完全無用。外賣的概念是將行數據讀入某種臨時變量,根據需要對其進行評估,然後根據需要將其輸出或添加到集合中。

EDIT 2

如果線路長度會有所變化,你需要抓住最後一個字段,而不是* N *個場,所以我改變了布爾字段採集來告訴你如何將總是得到最後一個字段,而不是第42個字段。

+0

BufferedStream不包含ReadLine()方法 – InfoLearner 2011-06-06 17:09:11

+0

我剛剛做了'.ReadLine'來指示循環正在遞增行。它僅用作僞代碼。 – JYelton 2011-06-06 17:13:27

+0

非常天真的解析CSV文件的方法,這可能取決於數據的外觀。 CSV允許逗號內的字段值可以用引號括起來。如果將它們放在引號中,則甚至可以在字段值內有回車符。當然,如果你想在字段值中引用引號,他們通常會通過引用兩次來逃脫。不管這些情況是否真的適用於提問的人都不知道,但這些都是需要考慮的重要事情。 – Kibbee 2011-06-06 17:15:00

1

首先,我不會逐字逐句接近任何文件,而不需要絕對需要它。其次,從.Net文本文件中讀取行是一個非常便宜的操作。

下面是一些天真的啓動代碼,而忽略字符串CSV值的可能性:

List<string> matchingLines = new List<string>(); 
using (var reader = new StreamReader("data.csv")) 
{ 
    string rawline; 
    while (null != (rawline = reader.ReadLine())) 
    { 
     if (rawline.TrimEnd().Split(',').Last() == "True") continue; 

     matchingLines.Add(rawline); 
    } 
} 

在現實中,它會建議每個CSV行解析爲一個強類型的對象,然後對收集過濾器使用LINQ。但是,這可以作爲單獨問題的單獨答案。

+0

如果某個列在引號內可以包含逗號分隔值,該怎麼辦?在這種情況下,您的代碼將會中斷。另外如果我想檢查第n列是否包含@符號,那麼這意味着我們需要以不同的方式處理該行。我很喜歡使用文本閱讀器,但需求要求我使用上述 – InfoLearner 2011-06-06 20:37:34

+0

@知識:根據我的答案,「...忽略字符串CSV值的可能性」。它的目的是作爲一個起點。然而,我想我很想知道爲什麼你被限制在一個'BufferedStream'中? – user7116 2011-06-06 20:44:09

0

這裏使用的解決方案一個StreamReader,而不是BufferedStream:

public string RemoveTrueRows(string csvFile) 
{ 
    var sr = new StreamReader(csvFile); 
    var line = string.Empty; 
    var contentsWithoutTrueRows = string.Empty; 
    while ((line = sr.ReadLine()) != null) 
    { 
     var columns = line.Split(','); 
     if (columns[ columns.Length - 1 ] == "True") 
     { 
      contentsWithoutTrueRows += line; 
     } 
    } 
    sr.Close(); 

    return contentsWithoutTrueRows; 
} 
相關問題