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

时间:2019-06-04 01:48:57

标签: c# .net csv csvhelper

我有一个函数,它可以完成相当于Web请求的操作,并且它返回格式化的CSV。我的目标是现在将这些数据导入CsvHelper。但是,我似乎无法让CSVParser只能从流中读取静态文本。

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

我完全不依赖于CsvHelper,但是我似乎找不到支持这种行为的CSV库。我该怎么办?

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

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

2 个答案:

答案 0 :(得分: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,而不要这样做。

答案 1 :(得分:1)

您可以使用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; }
}