Разделение многострочной строки с квалификаторами текста - PullRequest
1 голос
/ 27 октября 2019

У меня есть строка, которую мы получаем из данных Excel. Данные Excel выглядят примерно так:

enter image description here

и когда строка для этого заканчивается:

Abigail Hampton\tYXC37EGI8IV\t206\t\"in felis. Nulla tempor augue ac ipsum. Phasellus vitae mauris sit amet lorem semper auctor. Sskxsad assdie sk \"\"asda\"\" \r\nsoisdfi asdifsofid \"\"aasdfi dsio ck.\"\r\nTravis N. Carter\tHKZ93OEW1QO\t213\teu dolor egestas rhoncus. Proin nisl sem, consequat nec, mollis vitae, posuere\r\nLatifah B. Bryan\tJBL58YOF9OK\t236\tmauris erat eget ipsum.\r\n

Эта строкаявляется разделителем табуляции, и любая ячейка с символами новой строки определяется символом ", который также является escape-символом. Я хочу разделить эту строку на список, чтобы первая строка в списке была первой строкой, вторая строка - второй строкой, а третья строка - третьей строкой.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Я понял это. Зоар заслуживает похвалы за то, что указал мне на TextFieldParser.

Я удивлен, что у c # нет ничего подобного. Во всяком случае, вот как я решил эту проблему:

using Microsoft.VisualBasic.FileIO;
using System.IO;

string text; // This contains the text I posted in the question.
List<string[]> multilineString = new List<string[]>();
byte[] byteArray = Encoding.UTF8.GetBytes(text);                 // convert string to stream
MemoryStream stream = new MemoryStream(byteArray);
using (var myString = new TextFieldParser(stream))
{
    myString.TextFieldType = FieldType.Delimited;
    myString.SetDelimiters("\t");
    myString.HasFieldsEnclosedInQuotes = true;
    while (!myString.EndOfData)
    {
        string[] fieldArray;
        try
        {
            fieldArray = myString.ReadFields();
            multilineString.Add(fieldArray);
        }
        catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex)
        {
            continue;
        }
    }
}

Спасибо, Зохар!

0 голосов
/ 27 октября 2019
List<string> cellsList = new List<string>();
cellsList.AddRange(myString.Split('\t'));
string lineString = "";
List<string> linesList = new List<string>();
for (int i = 0; i < cellsList.Count; i++)
{
    lineString += cellsList[i];
    if((i + 1)%4 == 0)
    {
       linesList.Add(lineString);
       lineString = "";
    }
}

Где myString - строка, указанная вами выше. Обратите внимание, что это работает, только если в каждой строке ровно 4 ячейки!

...