2013-03-01 70 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文件中。