我有一个包含以下数据的txt文件
(0010,0010) : Patient's Name : LANE^LOIS^^^
(0010,0020) : Patient ID : AM-0053
(0010,0030) : Patient's Birth Date : 4/15/1982
(0010,0040) : Patient's Sex : F
我必须逐行阅读内容并创建一个包含以下详细信息的数据表 患者姓名,患者ID,患者出生日期,患者性别。常量(例如(0010,0010))将不会更改。它代表患者的姓名。你能否告诉我这项任务背后的逻辑。我有这么多,
逐行阅读
获取前11个字符并检查它是否为(0010,0010)
转到行尾,或者将行分开:
并获取数组的第二个元素。
我觉得好吗?或者我该如何改善表现?
答案 0 :(得分:2)
你的方法听起来很明智。用“:”分割似乎是一个合理的想法。
此类字符串处理将非常快速 - 并且比将结果数据记录写入磁盘或数据库要快得多,因此效率可能不应该是一个问题。
答案 1 :(得分:2)
在您知道存在问题之前不要担心性能,但一般情况下,如果您可以避免多余的内存分配,那么这对您有利。因此,如果你需要的只是最后一部分,你可以在字符串上使用StartsWith()
,这样你就不必创建一个后来被垃圾收集的子字符串,然后你可以使用LastIndexOf()
找到开始最后一部分,只是对剩余部分进行子串。
while((line = Console.ReadLine()) != null)
{
if (line.StartsWith("0010,0010"))
{
var pos = line.LastIndexOf(':');
if (pos != -1)
{
// do whatever with part
var part = line.SubString(pos+1).Trim();
}
}
}
答案 2 :(得分:1)
如果你的行包含(0010,0010)或(4 digigts后跟,另外4位数),你甚至可以在分割之前检查你的行。如果检测到,您可以拆分为字符串数组,修剪空格并填充表格行。您可以使用以下表达式查找(0010,0010)
Regex.IsMatch("line string here...", "[(]{1}[0-9]{4},{1}[0-9]{4}[)]{1}") // should be true if found
答案 3 :(得分:1)
这似乎是一种合理的方法。在成为问题之前我不会担心性能。
为了论证,让我们假设你有100,000个。首先编写一些工作代码,并使用System.Diagnostics.Stopwatch
来计算100多长时间。找到流程中运行时间最长的部分,并尝试缩短它。它可能(并且我没有尝试过)逐行读取文件。您可以尝试一次性读取文件,并将其拆分为换行符。使用处理器的所有内核并行运行它们可能会更好。
答案 4 :(得分:1)
这个小方法应该可以解决大多数问题。 :)它遍布各行(你必须调整循环并用文本阅读器替换它)
将所有内容都放在患者名单中。
void Main()
{
var input = @"(0010,0010) : Patient's Name : LANE^LOIS^^^
(0010,0020) : Patient ID : AM-0053
(0010,0030) : Patient's Birth Date : 4/15/1982
(0010,0040) : Patient's Sex : F
(0010,0010) : Patient's Name : LANE^LOIS^^^
(0010,0020) : Patient ID : AM-0053
(0010,0030) : Patient's Birth Date : 4/15/1982
(0010,0040) : Patient's Sex : F
(0010,0010) : Patient's Name : LANE^LOIS^^^
(0010,0020) : Patient ID : AM-0053
(0010,0030) : Patient's Birth Date : 4/15/1982
(0010,0040) : Patient's Sex : F";
List<Patient> patients = new List<Patient>();
Patient p = null;
foreach(var line in input.Split(new[] {'\n'}))
{
var value = line.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries).Last().Trim();
if(line.Trim().StartsWith("(0010,0010)"))
{
if(p != null)
patients.Add(p);
p = new Patient();
p.Name = value;
}
else if(line.Trim().StartsWith("(0010,0020)"))
{
p.ID = value;
}
else if(line.Trim().StartsWith("(0010,0030)"))
{
DateTime birthDate;
if(DateTime.TryParse(value, out birthDate))
p.BirthDate = birthDate;
}
else if(line.Trim().StartsWith("(0010,0040)"))
{
p.Sex = value.ToCharArray()[0];
}
}
if(p != null)
patients.Add(p);
}
public class Patient
{
public string Name { get; set; }
public string ID { get; set; }
public DateTime? BirthDate { get; set; }
public char Sex { get; set; }
}