MemoryStream to string[]
本文关键字:string to MemoryStream | 更新日期: 2023-09-27 18:01:58
我从内存中的zip文件(要求不写入磁盘)中读取CSV文件的内容到MemoryStream。并使用下面的代码来获取人类可读的字符串
string result = Encoding.ASCII.GetString(memoryStream.ToArray());
但是,我们希望结果是一个字符串[]来映射CSV文件中的每一行。
是否有自动处理的方法?
谢谢
首先,不需要在内存流上调用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文件中。