2013-03-01 71 views
2

我從內存中的zip文件(需要不寫入磁盤)讀取CSV文件的內容到MemoryStream中。並使用下面的代碼獲取人類可讀的字符串MemoryStream to string []

string result = Encoding.ASCII.GetString(memoryStream.ToArray()); 

但是,我們希望得到的結果是一個字符串[],在CSV文件中的每一行映射。

有沒有辦法自動處理?

感謝

+0

[在C#中解析CSV文件]的可能重複(http://stackoverflow.com/questions/2081418/parsing-csv-files-in-c-sharp) – 2013-03-01 17:44:28

回答

6

可以使用Split方法,通過換行來分割字符串:

string[] result = Encoding. 
        ASCII. 
        GetString(memoryStream.ToArray()). 
        Split(new string[] { Environment.NewLine }, StringSplitOptions.None); 
+0

以秒爲單位擊敗我:)要刪除我的有效副本。 – JerKimball 2013-03-01 17:45:28

+0

它發生在這裏很多:P – Zbigniew 2013-03-01 17:46:08

13

首先,有沒有必要打電話ToArray的內存流。只需使用一個StreamReader,並多次撥打ReadLine()

memoryStream.Position = 0; // Rewind! 
List<string> rows = new List<string>(); 
// Are you *sure* you want ASCII? 
using (var reader = new StreamReader(memoryStream, Encoding.ASCII)) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     rows.Add(line); 
    } 
} 
+0

對於'StreamReader'和'ASCII'註釋+1註釋 – Zbigniew 2013-03-01 17:46:57

+0

Hah - 對於「你確定要ASCII嗎?」+1。 – JerKimball 2013-03-01 17:47:04

2

根據您的CSV文件的內容,這可能是一個更難的問題比你給它的信貸。

假設這是您的CSV:

ID,數據1,數據2
1,一些數據,更多的數據
2,「這個元素有一個新行
就在場地中央「,如果你一行一行地閱讀,就會產生問題

如果你只是用reader.ReadLine()逐行讀取它,如果你發生了,你將不會得到你想要的東西用新行引用字段中間(通常在CSV中允許)。你需要更多這樣的東西

List<String> results = new List<string>(); 
StringBuilder nextRow = new StringBuilder(); 
bool inQuote = false; 
char nextChar; 
while(reader.ReadChar(out nextChar)){ // pretend ReadChar reads a char into nextChar and returns false when it hits EOF 
    if(nextChar == '"'){ 
    inQuote = !inQuote; 
    } else if(!inQuote && nextChar == '\n'){ 
    results.Add(nextRow.ToString()); 
    nextRow.Length = 0; 
    } else{ nextString.Append(nextChar); } 
} 

請注意,這處理雙引號。缺少引號將是一個問題,但它們始終位於.csv文件中。