【问题标题】:Read CSV from variable using CsvHelper (or similar library)使用 CsvHelper(或类似库)从变量中读取 CSV
【发布时间】:2019-06-04 01:48:57
【问题描述】:

我有一个函数,它可以产生与 Web 请求等效的东西,它会返回一个格式化的 CSV。我的目标是现在将这些数据导入 CsvHelper。但是,我似乎无法让 CSVParser 从静态文本中读取,只能从流中读取。

我可以将输出写入一个文件,然后再读回来,但我觉得这里没有多大意义。

我完全不受 CsvHelper 的束缚,但是我似乎找不到支持这种行为的 CSV 库。我该怎么做?

var csvString = functionThatReturnsCsv()
/* as string:
columnA,columnB
dataA,dataB
*/

// my goal
???.parse(csvString)

【问题讨论】:

  • 请注意(对于访问此问题并查看答案的任何人),使用 StringReader(如 David Specht 的回答所示)是更方便的方法,并导致更简单且最终更具可读性的代码与将字符串转换为字节数组到 MemoryStream 相比。毕竟,任何 CSV 解析器都需要将字节流转换回文本字符。 (不接受某种形式的文本源的 CSV 解析器 - 例如,TextReader - 真的不值得考虑,imo)

标签: c# .net csv csvhelper


【解决方案1】:

您可以将字符串转换为内存中的 Stream,然后将其用作 CSV 阅读器的源:

public static Stream StringAsStream(string value)
{
    return StringAsStream(value, System.Text.Encoding.UTF8);
}

public static Stream StringAsStream(string value, System.Text.Encoding encoding)
{
    var bytes = encoding.GetBytes(value);
    return new MemoryStream(bytes);
}

用法:

using (var stream = StringAsStream("hello"))
{
    // csv reading code here
}

或

using (var stream = StringAsStream("hello", Encoding.Ascii))
{
    // csv reading code here
}

Try it online

注意如果您从可以返回Stream(如网络请求)的源中读取,您应该使用Stream 而不是这样做。

【讨论】:

  • 我能问一下你为什么在这里使用 using 指令而不是只在代码中使用 var 吗?
  • 虽然您不需要将 Dispose 与 MemoryStream 一起使用,但对于您使用的任何 Stream 来说都是一种很好的做法,因为它们通常代表非托管资源(垃圾收集器无法收集这些资源)。一旦 using 块完成,using 将自动 clal Dispose - 即使发生异常。有关 using 的更多信息,请参阅here。
  • 好的。因此,如果我想创建一个返回另一个程序的标准输出的函数,我会从 using 定义中返回标准输出,对吗? (像这样rextester.com/VII34075)
  • 这就是我最终做的事情,它奏效了。感谢您的帮助!
【解决方案2】:

您可以使用StringReader。 CsvReader 构造函数采用TextReader 参数而不是Stream。如果您确实有一个流而不是字符串,只需将StringReader 替换为StreamReader。

public static void Main(string[] args)
{    
    using (var reader = new StringReader(FunctionThatReturnsCsv()))
    using (var csv = new CsvReader(reader))
    {
        var results = csv.GetRecords<Foo>().ToList();
    }            
}

public static string FunctionThatReturnsCsv()
{
    return "columnA,columnB\ndataA,dataB";
}

public class Foo
{
    public string columnA { get; set; }
    public string columnB { get; set; }
}          

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多