【问题标题】:Parse Byte[] to File without saving it将 Byte[] 解析为文件而不保存它
【发布时间】: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 编码的,则为

标签: c# .net


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2021-10-29
    • 1970-01-01
    • 2023-03-06
    • 2013-06-11
    相关资源
    最近更新 更多