【问题标题】:What is the most efficient way to substring specific portions of a text to a list of objects将文本的特定部分子串到对象列表的最有效方法是什么
【发布时间】:2019-08-31 18:03:06
【问题描述】:

我有以下 vCard 文本,我的目的是将文本解析为 vCard 对象列表

BEGIN:VCARD
VERSION:2.1
N:Kleit;Ali;;;
FN:Ali Kleit
TEL;CELL:70101010
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:Kleit;Saeed;;;
FN:Saeed Kleit
TEL;CELL:03494949
END:VCARD

以下是我的代码

 List<string> cards = new List<string>();

 if (text != null)
 {
     while (text.Length != 0)
     {
         int idx_begin = text.IndexOf("BEGIN:VCARD");

         if (idx_begin == -1)
             break;

         string endToken = "END:VCARD";
         int idx_end = text.IndexOf(endToken);

         if (idx_end == -1)
             break;

         string card = text.Substring(idx_begin, idx_end + endToken.Length);

         text = text.Substring(idx_end + endToken.Length);
         cards.Add(card);
     }
 }

接下来,使用Thought.vCards.vCard .NET Library 解析器解析每个找到的 vCard 文本


List<Thought.vCards.vCard> vCards = new List<Thought.vCards.vCard>();

List<string> failedStrings = new List<string>();

foreach (string card in cards)
{
    using (TextReader sr = new StringReader(card))
    {
        var vCard = new Thought.vCards.vCard(sr);

        if (vCard == null)
        {
            failedStrings.Add(card);
            continue;
        }

        vCards.Add(vCard);
    }
}

知道文本可能格式不正确,有没有更有效的方法来实现这一点?

【问题讨论】:

  • 与其创建一个字符串列表,为什么不解析字符串值呢?
  • @juharr 我实际上拆分了我的代码以提高可读性以指出主要目的是(将文本的特定部分子串到对象列表中)
  • 您可以将解析一个 vCard 的代码移动到一个方法中,并从从文件读取的代码中调用它,以保持拆分和可读性。

标签: c# vcf-vcard


【解决方案1】:

这样的?

var vcards = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "Contacts.vcf"));

var vcardRe = new Regex(@"BEGIN:VCARD\s+(.+?)\s+END:VCARD", RegexOptions.Compiled | RegexOptions.Singleline);


var res = vcardRe.Matches(vcards)
.Cast<Match>()
.Select(x => x.Groups[0].Captures.Cast<Capture>().Select(c => c.Value).Last())
;

List<Thought.vCards.vCard> vCards = new List<Thought.vCards.vCard>();

List<string> failedStrings = new List<string>();

foreach(string card in res)
{
    using (TextReader sr = new StringReader(card))
    {
        var vCard = new Thought.vCards.vCard(sr);

        if (vCard == null)
        {
            failedStrings.Add(card);
            continue;
        }

        vCards.Add(vCard);
    }
}

vCards.Dump();

【讨论】:

  • 不错的方法,但我尝试使用您的代码解析整个 vCard 列表,结果为 (50),而预期为 (52)。第一个 vCard 有一个带有 base64 字符串的 photo 属性。另一方面,第一个结果包括前 2 个 vCards ,而其他结果符合预期。这可能与正则表达式有关
  • @AliKleit 可能是。如果你能添加一些有问题的例子,我可以改进我的表达方式。
  • 当然,这是一个 .vcf 文件,其中包含 6 条记录(使用正则表达式生成 4 条)link,而这是结果的屏幕截图link
  • @AliKleit 好吧,正则表达式对于整个任务来说是不够的,但是用一个不那么雄心勃勃的表达式和你使用它的库。
猜你喜欢
  • 2016-02-06
  • 2021-12-17
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多