我有一个函数,它可以完成相当于Web请求的操作,并且它返回格式化的CSV。我的目标是现在将这些数据导入CsvHelper。但是,我似乎无法让CSVParser只能从流中读取静态文本。
我可以将输出写到文件中,然后再读回去,但是我觉得这里没有多大意义。
我完全不依赖于CsvHelper,但是我似乎找不到支持这种行为的CSV库。我该怎么办?
var csvString = functionThatReturnsCsv()
/* as string:
columnA,columnB
dataA,dataB
*/
// my goal
???.parse(csvString)
答案 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
}
注意:如果您正在阅读可以返回Stream
(例如网络请求)的来源,则应使用该Stream
,而不要这样做。
答案 1 :(得分:1)
您可以使用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; }
}