2016-03-24 6 views
2

Использования TextFieldParser из Microsoft.VisualBasic.FileIO, то можно разобрать CSV файл, как показано ниже:TextFieldParser разбор CSV из строки не файл

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

Однако это зависит от инициализации TextFieldParser с CSV путем к файлу. Возможно ли иметь такой же эффект, но при передаче в строке, содержащей саму запись данных?

Например, с записью данных CSV со значением Data1,6.5,"Data3 ""MoreData""" (обратите внимание на последние данные, заключенные в кавычки из-за сбежавших кавычки), сохраненные в переменной строки, может преобразовать данные в массив строк, как это:

[0] = "Data1" 
[1] = "6.5" 
[2] = "Data3 \"MoreData\"" 

ответ

6

Вы также можете создать экземпляр TextFieldParser из потока или из TextReader. Он не должен быть строковым путем. Таким образом, вы можете передавать его, как вам нравится, до тех пор, пока вы можете получить его в поток. Может быть просто 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); 
      } 
     } 
    } 
} 
+1

Пробовали ли вы с предлагаемым входом? Если да, и вы сделали это, пожалуйста, добавьте соответствующий код .... – Steve

+1

Добавленный пример кода: – ManoDestra

+0

Не так просто ... используйте входные данные, как в OP. Вы не можете разобрать этот текст с помощью TextFieldParser ... попробуйте с этим: _Data1,6.5, \ "Data3, \" MoreData \ "" _ (По крайней мере, я не могу это сделать) – Steve

5

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); 
     } 
    } 
} 

Вывод на консоль:

Line: 
    Field: Data1 
    Field: 6.5 
    Field: Data3,"MoreData"