使用 C# 删除 VCF 文件中的特定标签
Removing A specific Tag in VCF file using C#
我在 VCF 文件中有大量记录,问题是当 Phone 导出时,它添加了标签名称为 ."PHOTO" 的文件,当我将此 VCF 文件导入其他文件时phone,它将信息附加到姓名字段中,导致联系人姓名过长和过大,
我正在做的一件事是手动查找和删除,但是在一个有 25000 多行的文件中它是如此困难,
我正在考虑使用 REGX 移动并删除,但也有问题,对于某些记录,PHOTO 标签是最后的记录,然后 END:VCARD 在某些点 ITS,TEL;..
这是我的样本,只有一个线索,然后休息我会自己尝试。
public string RemoveBlockComments(string InputString)
{
string strRegex = @"<regx>";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
return myRegex.Replace(strTargetString, "");
}
这是测试数据:
PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK
CwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJB
TEL;TYPE=CELL:123456789
我想将照片中的所有内容删除到 BhJb(电话前)
可能的格式。
- 照片....
电话;
照片....
电子邮件;
照片....
- END:VCARD
根据我们的聊天讨论,您似乎需要做两件事:
- 获取
TEL
、EMAIL
、END
之后的文本(或有效值列表中的任何其他内容)
- 获取
PHOTO
开头的部分。
您可以使用 updated method:
轻松获得这 2 个值
private static String ReFormat(String str, out String removed)
{
Regex rgx = new Regex(@"(?msi)(?<removed>PHOTO\b.*?)(?=\b(?:TEL|EMAIL|END)\b)");
removed = rgx.Match(str).Groups["removed"].Value;
return str.Replace(removed, string.Empty);
}
在调用者中:
string removed = string.Empty;
string rest = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789", out removed);
或者我认为您可以使用一种方法 returns 键值对列表:
private static List<KeyValuePair<String, String>> ReFormat(String str)
{
return Regex.Matches(str, @"(?msi)(?<photo>PHOTO\b.*?)(?<tel>\b(?:TEL|EMAIL|END)\b.*?(?=\bPHOTO|$))").Cast<Match>().Select(p=> new KeyValuePair<String, String>(p.Groups["photo"].Value, p.Groups["tel"].Value)).ToList();
}
然后
var my_result = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789");
var mres1 = ReFormat("PHOTO;..jkh ohfhlahflkhasf fhasof\r\nTel:886886\r\ndataPHOTO:.ljlljhkdsghdsgd\n\rEmail:abc@abc.com..");
我在 VCF 文件中有大量记录,问题是当 Phone 导出时,它添加了标签名称为 ."PHOTO" 的文件,当我将此 VCF 文件导入其他文件时phone,它将信息附加到姓名字段中,导致联系人姓名过长和过大, 我正在做的一件事是手动查找和删除,但是在一个有 25000 多行的文件中它是如此困难,
我正在考虑使用 REGX 移动并删除,但也有问题,对于某些记录,PHOTO 标签是最后的记录,然后 END:VCARD 在某些点 ITS,TEL;..
这是我的样本,只有一个线索,然后休息我会自己尝试。
public string RemoveBlockComments(string InputString)
{
string strRegex = @"<regx>";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
return myRegex.Replace(strTargetString, "");
}
这是测试数据:
PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK
CwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJB
TEL;TYPE=CELL:123456789
我想将照片中的所有内容删除到 BhJb(电话前)
可能的格式。
- 照片....
电话;
照片....
电子邮件;
照片....
- END:VCARD
根据我们的聊天讨论,您似乎需要做两件事:
- 获取
TEL
、EMAIL
、END
之后的文本(或有效值列表中的任何其他内容) - 获取
PHOTO
开头的部分。
您可以使用 updated method:
轻松获得这 2 个值private static String ReFormat(String str, out String removed)
{
Regex rgx = new Regex(@"(?msi)(?<removed>PHOTO\b.*?)(?=\b(?:TEL|EMAIL|END)\b)");
removed = rgx.Match(str).Groups["removed"].Value;
return str.Replace(removed, string.Empty);
}
在调用者中:
string removed = string.Empty;
string rest = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789", out removed);
或者我认为您可以使用一种方法 returns 键值对列表:
private static List<KeyValuePair<String, String>> ReFormat(String str)
{
return Regex.Matches(str, @"(?msi)(?<photo>PHOTO\b.*?)(?<tel>\b(?:TEL|EMAIL|END)\b.*?(?=\bPHOTO|$))").Cast<Match>().Select(p=> new KeyValuePair<String, String>(p.Groups["photo"].Value, p.Groups["tel"].Value)).ToList();
}
然后
var my_result = ReFormat("PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMoHBwYIDAoMDAsK\r\nCwsNDhIQDQ4KL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\r\nBhJB\r\nTEL;TYPE=CELL:123456789");
var mres1 = ReFormat("PHOTO;..jkh ohfhlahflkhasf fhasof\r\nTel:886886\r\ndataPHOTO:.ljlljhkdsghdsgd\n\rEmail:abc@abc.com..");