使用 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
}
注意 如果您从可以 return 一个 Stream
的来源阅读(如网络请求),您应该使用 Stream
而不是这样做。
您可以使用 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; }
}
我有一个函数可以生成类似于 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
}
注意 如果您从可以 return 一个 Stream
的来源阅读(如网络请求),您应该使用 Stream
而不是这样做。
您可以使用 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; }
}