在C#中读取文本文件

时间:2011-11-02 13:53:28

标签: c# text file-management

我有一个包含以下数据的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)

转到行尾,或者将行分开:并获取数组的第二个元素。

我觉得好吗?或者我该如何改善表现?

5 个答案:

答案 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; }
}