C# C语言中多行字符串的解析#
我有一个字符串如下所示:C# C语言中多行字符串的解析#,c#,parsing,C#,Parsing,我有一个字符串如下所示: TYPE Email Forwarding SIGNATURE mysig.html COMPANY Smith Incorp CLIENT NAME James Henries ... heaps of others .... 我需要得到类型、签名、公司和客户名称的值。还有其他的,但一旦我能找到一个解决办法,如何做这些,我可以做其余的。我尝试拆分和修剪字符串,但它会拆分客户端名称等字段或电子邮件转发等值。我会将所有“键”值放入一个集合,然后将字符串解析到另一
TYPE Email Forwarding
SIGNATURE mysig.html
COMPANY Smith Incorp
CLIENT NAME James Henries
... heaps of others ....
我需要得到类型、签名、公司和客户名称的值。还有其他的,但一旦我能找到一个解决办法,如何做这些,我可以做其余的。我尝试拆分和修剪字符串,但它会拆分客户端名称等字段或电子邮件转发等值。我会将所有“键”值放入一个集合,然后将字符串解析到另一个集合,然后比较集合的值
以下是如何获得这些值的大致轮廓:
static void Main(string[] args)
{
//Assuming that you know all of the keys before hand
List<string> keys = new List<string>() { "TYPE", "SIGNATURE", "COMPANY", "CLIENT NAME" };
//Not sure of the origin of your string to parse. You would have to change
//this to read a file or query the DB or whatever
string multilineString =
@"TYPE Email Forwarding
SIGNATURE mysig.html
COMPANY Smith Incorp
CLIENT NAME James Henries";
//Split the string by newlines.
var lines = multilineString.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
//Iterate over keys because you probably have less keys than data in the event of duplicates
foreach (var key in keys)
{
//Reduce list of lines to check based on ones that start with a given key
var filteredLines = lines.Where(l => l.Trim().StartsWith(key)).ToList();
foreach (var line in filteredLines)
{
Console.WriteLine(line.Trim().Remove(0, key.Length + 1));
}
}
Console.ReadLine();
}
static void Main(字符串[]args)
{
//假设你事先知道所有的钥匙
列表键=新列表(){“类型”、“签名”、“公司”、“客户名称”};
//不确定要分析的字符串的来源。您必须更改
//这可以用来读取文件或查询数据库或任何东西
字符串多重约束=
@“键入电子邮件转发
签名mysig.html
史密斯公司
客户名称“詹姆斯·亨利”;
//用换行符拆分字符串。
var lines=multilestring.Split(新字符串[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
//迭代键,因为在重复的情况下,键可能比数据少
foreach(var键入键)
{
//根据以给定键开头的行减少要检查的行列表
var filteredLines=lines.Where(l=>l.Trim().StartsWith(key)).ToList();
foreach(filteredLines中的var行)
{
Console.WriteLine(line.Trim().Remove(0,key.Length+1));
}
}
Console.ReadLine();
}
这将完成您的工作
如果是多行,则可以循环遍历每行并调用KeyValue扩展方法,如下所示:
public static class Program
{
public static void Main()
{
var value = "TYPE Email Forwarding".KeyValue();
var value1 = "CLIENT NAME James Henries".KeyValue();
}
public static KeyValuePair<string, string> KeyValue(this string rawData)
{
var splitValue = rawData.Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries);
KeyValuePair<string, string> returnValue;
var key = string.Empty;
var value = string.Empty;
foreach (var item in splitValue)
{
if (item.ToUpper() == item)
{
if (string.IsNullOrWhiteSpace(key))
{
key += item;
}
else
{
key += " " + item;
}
}
else
{
if (string.IsNullOrWhiteSpace(value))
{
value += item;
}
else
{
value += " " + item;
}
}
}
returnValue = new KeyValuePair<string, string>(key, value);
return returnValue;
}
}
公共静态类程序
{
公共静态void Main()
{
var value=“键入电子邮件转发”。KeyValue();
var value1=“客户名称James Henries.KeyValue();
}
public static KeyValuePair KeyValue(此字符串为rawData)
{
var splitValue=rawData.Split(new[]{''},System.StringSplitOptions.removemptyEntries);
键值对返回值;
var key=string.Empty;
var值=string.Empty;
foreach(splitValue中的变量项)
{
if(item.ToUpper()==item)
{
if(string.IsNullOrWhiteSpace(key))
{
键+=项目;
}
其他的
{
键+=“”+项;
}
}
其他的
{
if(string.IsNullOrWhiteSpace(value))
{
价值+=项目;
}
其他的
{
值+=“”+项;
}
}
}
returnValue=新的KeyValuePair(键,值);
返回值;
}
}
请注意,只有当键都是大写且值不都是大写时,此逻辑才起作用。否则,无法识别哪个是钥匙(钥匙上没有手动轨迹)和哪个不是。请尝试提问。你想要的东西清单不是问题。向我们展示一些代码,并询问有关该代码的特定问题。