在c#中拆分字符串并访问特定索引处的数据
Splitting a string in c# and accessing data at a certain index
所以我有一个这样的字符串...
"Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45"
有没有办法拆分字符串,以便我可以访问数字“103”(供参考,具体取决于用户 activity)。我只对所述数字感兴趣,并且一直在尝试尝试使用 split 函数和数组,但运气不好 :(
从该行我确定了以下模式:
每行有多个字段,由 --
分隔
每个字段都是一个名称值对,其中名称与值由 :
分隔
所以:
string[] fieldSeparators = new string[] { "--" };
string[] nameValueSeparators = new string[] {":"};
var fieldsArray = row.Split(fieldSeparators, StringSplitOptions.RemoveEmptyEntries);
Dictionary fields = new Dictionary<string,string>();
foreach (var field in fieldsArray)
{
var tokens = field.Split(nameValueSeparators, StringSplitOptions.None);
if (tokens.Length >= 2)
fields[tokens[0]/*.Trim()*/] = tokens[1]/*.Trim()*/;
}
你想要的值(作为字符串)可以从字典中获得:
fields["Opp#"]
这比你说的要多,但看起来结构化的数据应该结构化。
尝试拆分 --
并从列表中取出 First()
元素。在该元素上在 :
处进行拆分并取第二个元素 ([1]
).
string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var elements = data.Split(new []{"--"}, StringSplitOptions.None);
var opp = Int32.Parse(elements.First().Split(':')[1].Trim());
如@steve 所言,如果您确定后面始终跟有一个数字,您只能在 ' '
进行 1 次拆分。
var opp = Int32.Parse(data.Split(' ')[1]);
您还可以创建一个模型来匹配该类型的数据。并创建一个函数将 string
反序列化为 model
。通过这种方式,您可以在需要时访问任何 属性。
示例:
string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var model = new ModelDeserialize("--"," ", 1).Deserialize(data);
这将使 Model
中的那种类型的字符串反序列化
public class ModelDeserialize
{
private string _elementsSeparator;
private string _dataSeparator;
private int _valueIdx;
public ModelDeserialize(string elementsSeparator, string dataSeparator, int valueIdx)
{
_elementsSeparator = elementsSeparator;
_dataSeparator = dataSeparator;
_valueIdx = valueIdx;
}
public Model Deserialize(string data)
{
var idx = 0;
var separatedElements = data.Split(new[] { _elementsSeparator }, StringSplitOptions.RemoveEmptyEntries);
var model = new Model();
model.Opp = Int32.Parse(Value(separatedElements[idx++]));
model.Member = Value(separatedElements[idx++]);
model.Patient = Value(separatedElements[idx++]);
model.Room = Value(separatedElements[idx++]);
model.Time = Value(separatedElements[idx]);
return model;
}
private string Value(string element)
{
return element.Split(new[] { _dataSeparator }, StringSplitOptions.None)[_valueIdx].Trim();
}
}
Model
,可以有一个更有意义的名字。
public class Model
{
public int Opp { get; set; }
public string Member { get; set; }
public string Patient { get; set; }
public string Room { get; set; }
public string Time { get; set; }
}
string content = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
string result = content.Split('-')[0].Split(':')[1].Trim();
您可以使用正则表达式来获取值
using System.Text.RegularExpressions;
Regex oppNumber = new Regex(@"^Opp#: (<?number>\d)+",RegexOptions.Compiled);
public int ParseValue(string line)
{
return Int32.Parse(oppNumber.Match(line).Groups["number"].Value);
}
此示例中没有错误检查,因此您需要添加额外的代码来处理格式错误的数据。
你可以试试正则表达式:
string s = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
Regex rex = new Regex(@"Opp#: (\d+) -- Member: ([^-]+)-- Patient: ([^-]+)-- Room: ([^-]+)-- Time: (.....)");
var match = rex.Match(s);
Console.WriteLine(match.Groups[1]); //103
Console.WriteLine(match.Groups[2]); //mem1
Console.WriteLine(match.Groups[3]); //patient1
Console.WriteLine(match.Groups[4]); //n.10
Console.WriteLine(match.Groups[5]); //16:45
所以我有一个这样的字符串...
"Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45"
有没有办法拆分字符串,以便我可以访问数字“103”(供参考,具体取决于用户 activity)。我只对所述数字感兴趣,并且一直在尝试尝试使用 split 函数和数组,但运气不好 :(
从该行我确定了以下模式:
每行有多个字段,由 --
分隔
每个字段都是一个名称值对,其中名称与值由 :
所以:
string[] fieldSeparators = new string[] { "--" };
string[] nameValueSeparators = new string[] {":"};
var fieldsArray = row.Split(fieldSeparators, StringSplitOptions.RemoveEmptyEntries);
Dictionary fields = new Dictionary<string,string>();
foreach (var field in fieldsArray)
{
var tokens = field.Split(nameValueSeparators, StringSplitOptions.None);
if (tokens.Length >= 2)
fields[tokens[0]/*.Trim()*/] = tokens[1]/*.Trim()*/;
}
你想要的值(作为字符串)可以从字典中获得:
fields["Opp#"]
这比你说的要多,但看起来结构化的数据应该结构化。
尝试拆分 --
并从列表中取出 First()
元素。在该元素上在 :
处进行拆分并取第二个元素 ([1]
).
string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var elements = data.Split(new []{"--"}, StringSplitOptions.None);
var opp = Int32.Parse(elements.First().Split(':')[1].Trim());
如@steve 所言,如果您确定后面始终跟有一个数字,您只能在 ' '
进行 1 次拆分。
var opp = Int32.Parse(data.Split(' ')[1]);
您还可以创建一个模型来匹配该类型的数据。并创建一个函数将 string
反序列化为 model
。通过这种方式,您可以在需要时访问任何 属性。
示例:
string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var model = new ModelDeserialize("--"," ", 1).Deserialize(data);
这将使 Model
public class ModelDeserialize
{
private string _elementsSeparator;
private string _dataSeparator;
private int _valueIdx;
public ModelDeserialize(string elementsSeparator, string dataSeparator, int valueIdx)
{
_elementsSeparator = elementsSeparator;
_dataSeparator = dataSeparator;
_valueIdx = valueIdx;
}
public Model Deserialize(string data)
{
var idx = 0;
var separatedElements = data.Split(new[] { _elementsSeparator }, StringSplitOptions.RemoveEmptyEntries);
var model = new Model();
model.Opp = Int32.Parse(Value(separatedElements[idx++]));
model.Member = Value(separatedElements[idx++]);
model.Patient = Value(separatedElements[idx++]);
model.Room = Value(separatedElements[idx++]);
model.Time = Value(separatedElements[idx]);
return model;
}
private string Value(string element)
{
return element.Split(new[] { _dataSeparator }, StringSplitOptions.None)[_valueIdx].Trim();
}
}
Model
,可以有一个更有意义的名字。
public class Model
{
public int Opp { get; set; }
public string Member { get; set; }
public string Patient { get; set; }
public string Room { get; set; }
public string Time { get; set; }
}
string content = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
string result = content.Split('-')[0].Split(':')[1].Trim();
您可以使用正则表达式来获取值
using System.Text.RegularExpressions;
Regex oppNumber = new Regex(@"^Opp#: (<?number>\d)+",RegexOptions.Compiled);
public int ParseValue(string line)
{
return Int32.Parse(oppNumber.Match(line).Groups["number"].Value);
}
此示例中没有错误检查,因此您需要添加额外的代码来处理格式错误的数据。
你可以试试正则表达式:
string s = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
Regex rex = new Regex(@"Opp#: (\d+) -- Member: ([^-]+)-- Patient: ([^-]+)-- Room: ([^-]+)-- Time: (.....)");
var match = rex.Match(s);
Console.WriteLine(match.Groups[1]); //103
Console.WriteLine(match.Groups[2]); //mem1
Console.WriteLine(match.Groups[3]); //patient1
Console.WriteLine(match.Groups[4]); //n.10
Console.WriteLine(match.Groups[5]); //16:45