我從內存中的zip文件(需要不寫入磁盤)讀取CSV文件的內容到MemoryStream中。並使用下面的代碼獲取人類可讀的字符串MemoryStream to string []
string result = Encoding.ASCII.GetString(memoryStream.ToArray());
但是,我們希望得到的結果是一個字符串[],在CSV文件中的每一行映射。
有沒有辦法自動處理?
感謝
我從內存中的zip文件(需要不寫入磁盤)讀取CSV文件的內容到MemoryStream中。並使用下面的代碼獲取人類可讀的字符串MemoryStream to string []
string result = Encoding.ASCII.GetString(memoryStream.ToArray());
但是,我們希望得到的結果是一個字符串[],在CSV文件中的每一行映射。
有沒有辦法自動處理?
感謝
可以使用Split
方法,通過換行來分割字符串:
string[] result = Encoding.
ASCII.
GetString(memoryStream.ToArray()).
Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
以秒爲單位擊敗我:)要刪除我的有效副本。 – JerKimball 2013-03-01 17:45:28
它發生在這裏很多:P – Zbigniew 2013-03-01 17:46:08
首先,有沒有必要打電話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);
}
}
對於'StreamReader'和'ASCII'註釋+1註釋 – Zbigniew 2013-03-01 17:46:57
Hah - 對於「你確定要ASCII嗎?」+1。 – JerKimball 2013-03-01 17:47:04
根據您的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文件中。
[在C#中解析CSV文件]的可能重複(http://stackoverflow.com/questions/2081418/parsing-csv-files-in-c-sharp) – 2013-03-01 17:44:28