使用 CsvHelper(或类似库)从变量中读取 CSV

Read CSV from variable using CsvHelper (or similar library)

我有一个函数可以生成类似于 Web 请求的东西,它 returns 是一个格式化的 CSV。我的目标是现在将此数据导入 CsvHelper。但是,我似乎无法让 CSVParser 从静态文本中读取,只能从流中读取。

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

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

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

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

您可以将字符串转换为 Stream in-memory,然后将其用作 CSV 的来源 reader:

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

注意 如果您从可以 return 一个 Stream 的来源阅读(如网络请求),您应该使用 Stream 而不是这样做。

您可以使用 StringReaderCsvReader 构造函数采用 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; }
}