将 Byte[] 解析为文件而不保存它
Posted
技术标签:
【中文标题】将 Byte[] 解析为文件而不保存它【英文标题】:Parse Byte[] to File without saving it 【发布时间】:2013-02-07 09:51:28 【问题描述】:我正在查询一个返回字节 [] 的 Web 服务(外部系统)。这个 byte[] 是一个 csv 文件,我将 byte[] 作为 csv 保存到临时位置,然后将 csv 文件解析到数据库。
是否可以直接读取 byte[] 而不是将文件保存到临时位置,而是将其存储在内存中并将文件内容解析到数据库中?
我看了Opening byte[] as a file without actually saving it as a file first 不确定现在情况是否发生了变化?任何输入将不胜感激。
【问题讨论】:
你想把 byte[] 转换成字符串吗?如果是这样,您可以调用 Encoding.UTF8.GetString(bytes) - 如果文件是 UTF8 编码的,则为 【参考方案1】:不是很容易找到,但标准中有一个 CSV 解析器。
public void HandleMycontent(byte[] content)
using (var stream = new System.IO.MemoryStream(content))
using (var reader = new StreamReader(stream))
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader))
//parse my csv here
【讨论】:
在 Microsoft.Csharp 中没有与 Microsoft.VisualBasic.FileIO.TextFieldParser 相同的东西吗?还是我真的必须使用对 VisualBasic 的引用? 恐怕你需要使用对 VisualBasic 的引用,我同意它的位置有点奇怪,但它仍然是框架的一部分。【参考方案2】:您可以使用MemoryStream
类代替FileStream
:
var stream = new MemoryStream(yourByteArray);
【讨论】:
可能希望将其包裹在StreamReader
中,以便至少使用 ReadLine
解析 CSV。
@GrantThomas CSV 在技术上比换行更微妙;我建议使用专用的 CSV 解析器...
@MarcGravell 当然,我同意;只是强调,仅此答案就给 OP 提供了一种管理字节的不同方式,并且对完成最终结果没有真正的价值。即使给出几行文字也会是一种成就......
@GrantThomas:据我了解 OP,他已经准备好读取文件的一切。我假设代码在流上运行。在这种情况下,他可以简单地将那个内存流放到他之前拥有文件流的地方。在这两种情况下,他是否包裹它都是一样的,这就是我省略它的原因。我不同意你的结论,即答案对他没有帮助。
@DanielHilgarth 说它对 OP 一点帮助都没有可能是言过其实。我想这是我们以不同方式看待问题的情况之一。我没有像你那样阅读它。【参考方案3】:
您链接到的相关问题是关于在 Word 中加载它。这与仅在本地解析它非常不同。在这种情况下,只需将其连接到 MemoryStream
和 CsvReader
(external link):工作完成:
using(var ms = new MemoryStream(theData))
using(var sr = new StreamReader(ms))
using(var reader = new CsvReader(sr))
// read the data...
【讨论】:
public CsvReader(System.IO.TextReader reader, bool hasHeaders) 成员 LumenWorks.Framework.IO.Csv.CsvReader 摘要:初始化 CsvReader 类的新实例。参数: reader:指向 CSV 文件的 TextReader。 hasHeaders:如果字段名称位于第一个非注释行上,则为 true,否则为 false。例外:ArgumentNullException:读者为空。 ArgumentException: 无法从阅读器中读取。【参考方案4】:对此并不完全确定,因为另一方面对象应该按照相同的逻辑进行序列化,但您可以尝试一下:
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
memoryStream.Write(serializedInstance, 0, serializedInstance.Length);
memoryStream.Seek(0, SeekOrigin.Begin);
string deserializedInstance = (string)binaryFormatter.Deserialize(memoryStream);
【讨论】:
以上是关于将 Byte[] 解析为文件而不保存它的主要内容,如果未能解决你的问题,请参考以下文章