C#将多行读入单个变量

时间:2016-10-24 06:54:57

标签: c# readline

我看过,但找不到可以解决我问题的教程。也许我没有正确地说出我的搜索。无论如何,我在这里。

我接管了一家杂工公司,他有大约150名客户。他有一个他买的程序,为他的客户创造了记录。我有记录,但他不会把这个程序卖给我,因为它是商业性的,而且他害怕因出售类似的东西而入狱......无论如何......它们是用文本文件写的。格式似乎是:

string name
string last_job_description
int    job_codes
string job_address
string comments

文本文件如下所示

*Henderson*
*Cleaned gutters, fed the lawn, added mulch to the front flower beds,
 cut the back yard, edged the side walk, pressure washed the driveway*
*04 34 32 1 18 99 32 22 43 72 11 18*
*123 Anywhere ave*
*Ms.always pays cash no tip. Mr. gives you a check but always tips*

好吧..我的问题是在C#中我想编写一个程序来编辑这些记录,添加新客户并删除一些我可能丢失,移动或死亡......但是第二个条目分为两行,有时候3和4行。它们都以*开头和结尾。那么,我如何读取2到4行并将它们放入last_job_description字符串变量中?我可以写课,我可以读行,我可以删掉星号。在将多行读入单个变量时,我什么都找不到。

5 个答案:

答案 0 :(得分:0)

如果你想将文件中的所有行读成单个变量,那么你需要这样做

var txt = File.ReadAllText(.. your file location here ..);

或者你可以做

var lines = File.ReadAllLines(.. your file location here);然后您可以遍历每一行并删除原样的空白。

但根据你的问题,第一行是你真正追求的

答案 1 :(得分:0)

当您阅读last_job_description时,请阅读第二行。如果它以*开头,则意味着该行为job_codes,否则将其附加到pervous读取行。在找到job_codes之前,每行都这样做。

using (var fileReader = new StreamReader("someFile"))
        {
            // read some pervous data here

            var last_job_description = fileReader.ReadLine();
            var nextLine = fileReader.ReadLine();
            while (nextLine.StartsWith("*") == false)
            {
                last_job_description += nextLine;
                nextLine = fileReader.ReadLine();
            }
            //you have job_codes in nextline, so parse it now and read next data
        }

或者您甚至可以使用每组数据开始和结束的事实!使用*,因此您可以创建读取每个“set”的函数并将其作为单行字符串返回,无论它实际上有多少行。让我们假设您传递给此函数的reader变量与上层代码中的StreamReader相同

function string readSingleValue(StreamReader fileReader){
    var result = "";
    do
    {
        result += fileReader.ReadLine().Trim();
    } while (result.EndsWith("*") == false);
    return result;
}

答案 2 :(得分:0)

我认为你的问题并不复杂。我想说的是它没有提到具体问题。它至少包含3个不同的编程方面,您需要了解或学习如何实现目标。您必须采取的步骤如下所述。

  • 很遗憾,您需要将当前文件视为巨大的字符串类型。
  • 然后你就可以处理这个字符串并分开不同的部分。
  • 下一步是定义一个整洁,可靠,健壮的XML文件,它可以保存您的数据。
  • 用操纵的字符串填充xml
  • 如果您有xml文件,则只需更新即可。

答案 3 :(得分:0)

没有内置的方法可以完全按照您的意愿解析您的文件,因此您必须弄清楚。

以下是针对特定案例的工作代码示例。我假设你想在数组中使用job_codes,因为它们是由空格分隔的多个整数。

每当我们遇到以'*'开头的行时,我们会增加一个计数器,告诉我们使用您的下一个属性(名称,上一个职位描述等)。

每一行都附加到当前属性。

显然,我们会从每行的开头和结尾删除星星。

string name = String.Empty;
string last_job_description = String.Empty;
int[] job_codes = null;
string job_address = String.Empty;
string comments = String.Empty;

int numberOfPropertiesRead = 0;
var lines = File.ReadAllLines("C:/yourfile.txt");

for (int i = 0; i < lines.Count(); i++)
{
    var line = lines[i];
    bool newProp = line.StartsWith("*");
    bool endOfProp = line.EndsWith("*");

    if (newProp)
    {
        numberOfPropertiesRead++;
        line = line.Substring(1);
    }

    if (endOfProp)
        line = line.Substring(0, line.Length - 1);

    switch (numberOfPropertiesRead)
    {
        case 1: name += line; break;
        case 2: last_job_description += line; break;
        case 3:
            job_codes = line.Split(' ').Select(el => Int32.Parse(el)).ToArray();
            break;
        case 4: job_address += line; break;
        case 5: comments += line; break;
        default:
            throw new ArgumentException("Wow, that's too many properties dude.");
    }
}

Console.WriteLine("name: " + name);
Console.WriteLine("last_job_description: " + last_job_description);
foreach (int job_code in job_codes)
    Console.Write(job_code + " ");
Console.WriteLine();
Console.WriteLine("job_address: " + job_address);
Console.WriteLine("comments: " + comments);
Console.ReadLine();

答案 4 :(得分:0)

让我们做对了!

首先定义客户模型:

public class Customer
{
    public string Name { get; set; }
    public string LastJobDescription { get; set; }
    public List<int> JobCodes { get; set; }
    public string JobAddress { get; set; }
    public string Comments { get; set; }
}

然后,我们需要一组客户:

var customers = new List<Customer>();

使用文件中的数据填充集合:

string text = File.ReadAllText("customers.txt");
string pattern = @"(?<= ^ \*) .+? (?= \* \r? $)";

var options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled
    | RegexOptions.Singleline | RegexOptions.Multiline;
var matches = Regex.Matches(text, pattern, options);

for (int i = 0; i < matches.Count; i += 5)
{
    var customer = new Customer
    {
        Name = matches[i].Value,
        LastJobDescription = matches[i + 1].Value,
        JobCodes = matches[i + 2].Value.Split().Select(s => int.Parse(s)).ToList(),
        JobAddress = matches[i + 3].Value,
        Comments = matches[i + 4].Value
    };
    customers.Add(customer);
}

我使用的正则表达式允许在行的中间放置*字符。

现在我们可以轻松地使用这个系列。

使用示例。

删除第一位客户:

customers.RemoveAt(0);

向最新客户添加评论:

customers.Last().Comments += " Very generous.";

以Henderson的名义查找客户的第一条记录,并添加所执行作业的代码:

customers.Find(c => c.Name == "Henderson").JobCodes.Add(42);

添加新客户:

var customer = new Customer
{
    Name = "Chuck Norris",
    LastJobDescription= "Saved the world.",
    JobCodes = new List<int>() { 1 },
    JobAddress = "UN",
    Comments = "Nice guy!"
};
customers.Add(customer);

等等。

要将数据保存到文件,请使用以下命令:

var sb = new StringBuilder();
foreach (var customer in customers)
{
    sb.Append('*').Append(customer.Name).Append('*').AppendLine();
    sb.Append('*').Append(customer.LastJobDescription).Append('*').AppendLine();
    sb.Append('*').Append(string.Join(" ", customer.JobCodes)).Append('*').AppendLine();
    sb.Append('*').Append(customer.JobAddress).Append('*').AppendLine();
    sb.Append('*').Append(customer.Comments).Append('*').AppendLine();
}
File.WriteAllText("customers.txt", sb.ToString());

您可能需要图形用户界面。如果是这样,我建议您提出一个新问题,您可以在其中指定您使用的内容:WinForms,WPF,Web应用程序或其他内容。