我从内存中的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