MemoryStream to string[]

本文关键字:string to MemoryStream | 更新日期: 2023-09-27 18:01:58

我从内存中的zip文件(要求不写入磁盘)中读取CSV文件的内容到MemoryStream。并使用下面的代码来获取人类可读的字符串

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

但是,我们希望结果是一个字符串[]来映射CSV文件中的每一行。

是否有自动处理的方法?

谢谢

MemoryStream to string[]

首先,不需要在内存流上调用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);
    }
}

您可以使用Split方法以换行符分隔字符串:

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

根据CSV文件的内容,这可能是一个比您想象的要困难得多的问题。

假设这是您的csv:

id, data1, data2
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文件中。