TextFieldParser从字符串而不是文件解析CSV

Cal*_*ins 5 c# csv textfieldparser

使用Microsoft.VisualBasic.FileIO中的TextFieldParser,可以解析CSV文件,如下所示:

using (TextFieldParser parser = new TextFieldParser(CSVPath))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    parser.HasFieldsEnclosedInQuotes = true;
    while (!parser.EndOfData) { string[] fields = parser.ReadFields(); }
}
Run Code Online (Sandbox Code Playgroud)

但是,这依赖于使用CSV文件路径初始化TextFieldParser.是否可以产生相同的效果,但在传递包含数据记录本身的字符串时?

例如,对于Data1,6.5,"Data3 ""MoreData"""保存在字符串变量中的值为(注意由于转义的引号引用的引号括起来的最后数据)的CSV数据记录,我可以将数据转换为字符串数组,如下所示:

[0] = "Data1"
[1] = "6.5"
[2] = "Data3 \"MoreData\""
Run Code Online (Sandbox Code Playgroud)

Cal*_*ins 12

包含原始字符串的StringReader可以传递给新的TextFieldParser并以相同的方式处理.

StringReader sr = new StringReader("Data1,6.5,\"Data3,\"\"MoreData\"\"\"");
using (var parser = new TextFieldParser(sr))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    parser.HasFieldsEnclosedInQuotes = true;
    while (!parser.EndOfData)
    {
        Console.WriteLine("Line:");
        var fields = parser.ReadFields();
        foreach (var field in fields)
        {
            Console.WriteLine("\tField: " + field);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出到控制台:

Line:
    Field: Data1
    Field: 6.5
    Field: Data3,"MoreData"
Run Code Online (Sandbox Code Playgroud)

  • 这有效。我可以验证。像这样简单的答案节省了我很多时间。 (2认同)

Man*_*tra 7

您还可以从Stream或TextReader实例化TextFieldParser.它不必是字符串路径.因此,只要您可以将其整合到流中,您就可以将它真正地流式传输.可能只是一个MemoryStream.

https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser%28v=vs.110%29.aspx

例如

using (var stream = new MemoryStream())
{
    var input = "A, B, C, D\r\n";
    input += "Jeremy,Paul,Linda,Joe\r\n";
    var bytes = System.Text.Encoding.Default.GetBytes(input);
    stream.Write(bytes, 0, bytes.Length);
    stream.Seek(0, SeekOrigin.Begin);
    using (var parser = new TextFieldParser(stream))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        parser.HasFieldsEnclosedInQuotes = true;
        while (!parser.EndOfData)
        {
            Console.WriteLine("Line:");
            var fields = parser.ReadFields();
            foreach (var field in fields)
            {
                Console.WriteLine("\tField: " + field);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)