Чтение CSV из переменной с помощью CsvHelper (или подобной библиотеки) - PullRequest
0 голосов
/ 04 июня 2019

У меня есть функция, которая делает что-то эквивалентное веб-запросу, и она возвращает отформатированный CSV. Моя цель - импортировать эти данные в CsvHelper. Однако я не могу заставить CSVParser читать из статического текста, только из потока.

Я мог бы записать вывод в файл и затем прочитать его обратно, но я чувствую, что здесь нет особого смысла.

Я совсем не привязан к CsvHelper, однако не могу найти библиотеку CSV, поддерживающую это поведение. Как мне это сделать?

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

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

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вы можете использовать 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; }
}          
1 голос
/ 04 июня 2019

Вы можете преобразовать строку в 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 вместо того, чтобы делать это.

...