将 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 中加载它。这与仅在本地解析它非常不同。在这种情况下,只需将其连接到 MemoryStreamCsvReader (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[] 解析为文件而不保存它的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 WARC 文件?

将动态 JSON 解析为 Oracle 表

如何将生成的解析树保存为 IntelliJ 上 ANTLR4 插件的 .svg 文件?

如何将解析和更改的 DOM 文档保存在 xml 文件中?

Python将字符串读取为字节而不进行转换

将 C 字节数组解析为 Java ByteBuffer。