【问题标题】:Splitting a multiline string that has text qualifiers拆分具有文本限定符的多行字符串
【发布时间】:2019-10-27 20:22:18
【问题描述】:

我有一个从 Excel 数据中得到的字符串。 excel 数据如下所示:

当这个字符串结束时:

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

此字符串是制表符分隔的,任何带有换行符的单元格都由" 字符限定,该字符也是转义字符。 我要做的就是把这个字符串拆分成一个列表,这样列表中的第一个字符串是第一行,第二个字符串是第二行,第三个字符串是第三行。

【问题讨论】:

标签: c# string split


【解决方案1】:

我想通了。 Zohar 将我指向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;
        }
    }
}

谢谢佐哈尔!

【讨论】:

  • 仅仅因为它在 Microsoft.VisualBasic 命名空间中并不意味着它实际上属于 Visual Basic。
  • 也不知道。谢谢。
【解决方案2】:
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 个单元格时才有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多